jscrollpane中心对齐

1yjd4xko  于 2021-06-26  发布在  Java
关注(0)|答案(2)|浏览(221)

这个问题与此非常相似:当有足够的空间来显示我尝试过的这个解决方案的内容时,jscrollpane不会顶部对齐,但它不起作用。
当我向jscrollpane添加jlabel时,当jlabel很小时,标签就居中了。当滚动条显示时,它工作正常。设置boxlayout不会更改任何内容。我觉得这不是正常工作,因为我设置了一个性能的大小面板?但如果我把线移开 panel.setPreferredSize(new Dimension((int)(screenSize.width*0.7 - 50), screenSize.height-150)); 当没有文本时,标签会变小,并且会变大以容纳文本,这是我不想要的。如果我添加面板而不是标签,它会使屏幕滚动,即使没有文本?
这是我的密码:

public class Test {
    // JFrame 
    static JFrame frame = new JFrame("Test"); 
    //panel 1
    static JPanel panel = new JPanel(new BorderLayout());
    // label to display text 
    static JLabel label = new JLabel(); 
    //scroll panel in main method

    public static void main(String[] args) throws Exception {
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

        label.setBorder(new EmptyBorder(5, 5, 5, 20));
        label.setText("any text makes it centered beyond 40 lines");
        //create panel
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
        panel.add(label, BorderLayout.NORTH);
        panel.add(Box.createVerticalGlue());
        panel.setPreferredSize(new Dimension((int)(screenSize.width*0.7 - 50), screenSize.height-150));
        panel.setBorder(new EmptyBorder(5, 5, 5, 10));

        JScrollPane jspanel = new JScrollPane(label, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        //jspanel.add(label, BorderLayout.CENTER);
        jspanel.setPreferredSize(new Dimension((int)(screenSize.width*0.7 - 70), screenSize.height-180));
        jspanel.getVerticalScrollBar().setUnitIncrement(20);
        jspanel.setBorder(BorderFactory.createEmptyBorder());
        jspanel.setAlignmentX(JScrollPane.LEFT_ALIGNMENT);
        jspanel.setAlignmentY(JScrollPane.TOP_ALIGNMENT);
        //panel.setPreferredSize(new Dimension(640, 480));
        //frame.add(panel);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(jspanel);
        frame.setSize((int)(screenSize.width*0.7), screenSize.height - 50);
        frame.revalidate();
        frame.pack();  
        frame.setVisible(true);
    }
}
mpbci0fu

mpbci0fu1#

在重新编写代码之后,我想到了以下gui。

我在电话里加了个电话
SwingUtilities invokeLater 方法。此方法确保在事件调度线程上创建和执行所有swing组件。
我消除了所有静态引用,除了 main 方法。
我将您的代码重新编写为方法,以便一次只关注gui的一部分。
下面是完整的可运行示例。这是一个最小的可复制的例子。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;

public class JScrollPaneTestGUI implements Runnable {

    public static void main(String[] args) { 
        SwingUtilities.invokeLater(new JScrollPaneTestGUI());
    }

    @Override
    public void run() {
        JFrame frame = new JFrame("JScrollPane Test"); 
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JScrollPane jspanel = createJScrollPane();
        frame.add(jspanel, BorderLayout.CENTER);

        frame.pack();  
        frame.setVisible(true);
    }

    private JScrollPane createJScrollPane() {
        JPanel panel = new JPanel(new BorderLayout());
        panel.setBackground(Color.YELLOW);
        panel.setPreferredSize(new Dimension(400, 300));

        JLabel label = new JLabel();
        label.setBorder(new EmptyBorder(5, 5, 5, 20));
        label.setText("any text makes it centered beyond 40 lines");
        //create panel
        panel.add(label, BorderLayout.NORTH);

        JScrollPane jspanel = new JScrollPane(panel);

        return jspanel;
    }

}
k4ymrczo

k4ymrczo2#

jspanel.setAlignmentX(JScrollPane.LEFT_ALIGNMENT);
    jspanel.setAlignmentY(JScrollPane.TOP_ALIGNMENT);

这将在其父容器中对齐滚动窗格,具体取决于所使用的布局管理器。它不会影响添加到滚动窗格的任何组件的对齐方式。这是不需要的。
标签居中
标签的大小可以填充整个可用空间,因此需要自定义标签文本的绘制方式。
如果不想将其居中,则可以使用以下方法将其放置在顶部:

label.setVerticalAlignment( SwingConstants.TOP );

相关问题