java - 添加 JPanel 后 JLabel 错位

标签 java swing jpanel jlabel

读了很多 java swing 文章后我几乎失明了,但仍然无法让面板工作。
当我添加 2 个 JLabel 时,它们很好地向左对齐,并由 EmptyBorder 定义了 5px 填充,正如我希望的那样。

enter image description here

我发现添加带有额外边框的 ProgressBar 进行填充后,无法按预期工作,又添加了 1 个面板,我在其中添加了 ProgressBar。进展看起来不错,但我所有的标签都被替换了。
最后看起来像这样(红色背景用于调试,看看 JPanel 是如何绘制的): enter image description here

问题1:如何解决这个问题?
问题2:将面板与其他面板一起放置在其他面板内部只是为了获得我想要的格式,这是swing的标准方法吗?



来源:

public class AppInitProgressDialog {
    private static final int        VIEW_PADDING_VAL = 5;
    private static final Border     viewPaddingBorder = new EmptyBorder( VIEW_PADDING_VAL, VIEW_PADDING_VAL, VIEW_PADDING_VAL, VIEW_PADDING_VAL );

    private JPanel          view;   // Dialog view
    private JPanel          panel;

    private JPanel          progressPanel;

    private JLabel          title;
    private JLabel          progressDesc;
    private JProgressBar    progressBar;

    private void initPanel( int w, int h ) {
        view = new JPanel();
        view.setBorder( BorderFactory.createRaisedSoftBevelBorder() );
        view.setBackground( Color.LIGHT_GRAY );
        view.setSize( w, h );
        view.setLayout( new BorderLayout() );

        panel = new JPanel();
        panel.setBorder( viewPaddingBorder );
        panel.setLayout( new BoxLayout(panel, BoxLayout.PAGE_AXIS) );
        //panel.setLayout( new SpringLayout() );
        panel.setOpaque( false );

        JFrame parent = AppContext.getMe().getAppWindow().getFrame();
        int posx = (parent.getWidth() - w)/2;
        int posy = (parent.getHeight() - h)/2;
        view.add( panel, BorderLayout.CENTER );
        view.setLocation( posx, posy );
    }

    private void initTitle() {
        title = new JLabel( "Progress title" );
        title.setAlignmentX( JComponent.LEFT_ALIGNMENT );
        panel.add(title);
    }

    private void initProgress() {
        progressPanel = new JPanel( new BorderLayout() );
        progressPanel.setBackground( Color.LIGHT_GRAY );
        progressPanel.setBorder( new EmptyBorder( 15, 30, 15, 30) );
        progressPanel.setBackground( Color.RED );

        progressBar = new JProgressBar(0, 10000);
        progressBar.setStringPainted(true);
        progressBar.setAlignmentX( JComponent.LEFT_ALIGNMENT );
        progressPanel.add(progressBar);

        panel.add( progressPanel );
        progressDesc = new JLabel( "Progress description" );
        panel.add(progressDesc);
    }

    public AppInitProgressDialog() {
        initPanel( 400, 100 );
        initTitle();
        initProgress();
    }

    public JComponent getView() {
        return view;
    }
}

最佳答案

或者,您可以将 BorderLayout 用于 panel:

panel = new JPanel(new BorderLayout());
...
panel.add(title, BorderLayout.NORTH);
...
panel.add(progressPanel); // default CENTER
...
panel.add(progressDesc, BorderLayout.SOUTH);

image

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.border.EmptyBorder;

/**
 * @see http://stackoverflow.com/a/16837816/230513
 */
public class Test {

    private JFrame f = new JFrame("Test");

    private void display() {
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new AppInitProgressDialog().getView());
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    class AppInitProgressDialog {

        private static final int VIEW_PADDING_VAL = 5;
        private JPanel view;   // Dialog view
        private JPanel panel;
        private JPanel progressPanel;
        private JLabel title;
        private JLabel progressDesc;
        private JProgressBar progressBar;

        private void initPanel(int w, int h) {
            view = new JPanel();
            view.setBorder(BorderFactory.createRaisedBevelBorder());
            view.setBackground(Color.LIGHT_GRAY);
            view.setSize(w, h);
            view.setLayout(new BorderLayout());

            panel = new JPanel(new BorderLayout());
            panel.setBorder(BorderFactory.createLineBorder(Color.blue));
            panel.setOpaque(false);

            view.add(panel, BorderLayout.CENTER);
        }

        private void initTitle() {
            title = new JLabel("Progress title");
            title.setAlignmentX(JComponent.LEFT_ALIGNMENT);
            panel.add(title, BorderLayout.NORTH);
        }

        private void initProgress() {
            progressPanel = new JPanel(new BorderLayout());
            progressPanel.setBackground(Color.LIGHT_GRAY);
            progressPanel.setBorder(new EmptyBorder(15, 30, 15, 30));
            progressPanel.setBackground(Color.RED);

            progressBar = new JProgressBar(0, 10000);
            progressBar.setStringPainted(true);
            progressBar.setAlignmentX(JComponent.LEFT_ALIGNMENT);
            progressPanel.add(progressBar);

            panel.add(progressPanel);
            progressDesc = new JLabel("Progress description");
            panel.add(progressDesc, BorderLayout.SOUTH);
        }

        public AppInitProgressDialog() {
            initPanel(400, 100);
            initTitle();
            initProgress();
        }

        public JComponent getView() {
            return view;
        }
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Test().display();
            }
        });
    }
}

关于java - 添加 JPanel 后 JLabel 错位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16833114/

相关文章:

java - 如何编写Excel文件

java - 获取原始 HTML/向 WebView 页面添加 Javascript

java - 自定义 ArrayAdapter 中的 Searchview

Java Swing : how to stop unwanted shift-tab keystroke action

java - swing - 如何设置为选项卡式 Pane 分配选项卡按钮?

java - 如何强制显示JScrollPane中的组件

java - 在 Java 中将参数传递给 Python 脚本

java - 转换为 JScrollPane 中 JTable 的图像

java - 如何在两个框架之间分割一个框架?

java - Swing:GridBagLayout动态复选框位置