JPanels的对齐方式

时间:2017-07-10 00:10:37

标签: java swing

我是Java的新手,我完全失败了。我试图创建一个简单的程序,绘制一个圆圈并在屏幕上输出它的属性。从功能上来说,该程序工作正常,但JPanels的布局是关闭的。出于某种原因,JPanel之间存在着一个差距,即“吸引我”。按钮和保持圆圈的JPanel。即使我调整了程序的高度,间隙也不会消失。同样,程序中的标签也没有与左边对齐,它们偏离中心有一些奇怪的原因,删除边框似乎没什么帮助。我被困了......

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Ellipse2D;

public class MainPanel extends JPanel {
private JPanel userHelpSubPanel;
private JPanel inputSubPanel;
private JPanel buttonSubPanel;
private JPanel drawSubPanel;
private JPanel resultsSubPanel;
private JLabel userHelpLabel;
private JLabel diameterLabel;
private JLabel circumferenceLabel;
private JLabel areaLabel;
private JButton drawButton;
private JTextField inputTextField;
private float radius;

public MainPanel() {
    radius = 0;

    setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));

    userHelpSubPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));

    inputSubPanel = new JPanel();
    inputSubPanel.setLayout(new BoxLayout(inputSubPanel, BoxLayout.Y_AXIS));

    drawSubPanel = new JPanel() {
        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);

            Graphics2D g2d = (Graphics2D) g;

            g2d.draw(new Ellipse2D.Double(150, 20, radius * 2, radius * 2));
        }
    };

    resultsSubPanel = new JPanel();
    resultsSubPanel.setLayout(new BoxLayout(resultsSubPanel, BoxLayout.Y_AXIS));

    buttonSubPanel = new JPanel();

    userHelpLabel = new JLabel();
    userHelpLabel.setText("Enter the radius of the ellipse: ");

    inputTextField = new JTextField();
    inputTextField.setMaximumSize(new Dimension(Integer.MAX_VALUE, inputTextField.getPreferredSize().height));

    drawButton = new JButton("Draw Me");
    drawButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            MainPanel.this.radius = Float.parseFloat(inputTextField.getText());

            diameterLabel.setText(String.format("Diameter: %.1f", 2 * radius));
            circumferenceLabel.setText(String.format("Circumference: %.1f", 2 * Math.PI * radius));
            areaLabel.setText(String.format("Area: %.1f", Math.PI * Math.pow(radius, 2)));

            drawSubPanel.repaint();
        }
    });

    circumferenceLabel = new JLabel("Circumference: N/A");
    diameterLabel = new JLabel("Diameter: N/A");
    areaLabel = new JLabel("Area: N/A");

    userHelpSubPanel.add(userHelpLabel);
    inputSubPanel.add(inputTextField);
    buttonSubPanel.add(drawButton);
    resultsSubPanel.add(diameterLabel);
    resultsSubPanel.add(circumferenceLabel);
    resultsSubPanel.add(areaLabel);

    add(userHelpLabel);
    add(inputSubPanel);
    add(buttonSubPanel);
    add(drawSubPanel);
    add(resultsSubPanel);
}
}

这就是它的样子......

https://i.stack.imgur.com/PEHVE.png

2 个答案:

答案 0 :(得分:1)

BoxLayout将尊重组件的最小和最大尺寸。因此,如果框架中有额外的空间,那么面板将获得更多空间。

解决方案是覆盖自定义面板的getMaximumSize()方法,以返回面板的首选大小。

每个Swing组件都有责任确定自己的首选大小。因此,这意味着您还需要覆盖自定义绘图所在面板的getPreferredSize()。首选尺寸将取决于您绘制的椭圆的大小/位置。

答案 1 :(得分:-3)

针对这些问题的一个简单修复是为您的面板(相关的)提供一个空边框,然后减少太大的特定方向:

// this example reduces the top of your circle panel.
drawSubPanel.setBorder(new EmptyBorder(-100, 0, 0, 0));

显然,这不是问题的根源,并不是最优的,但应该可以解决问题。