Java 当标签太小时,Jscrollpane中心对齐

Java 当标签太小时,Jscrollpane中心对齐,java,swing,jscrollpane,Java,Swing,Jscrollpane,这个问题与此非常相似:我尝试了这个解决方案,但它不起作用 当我将jlabel添加到jscrollpane时,当jlabel很小时,标签将居中。当滚动条显示时,它工作正常。设置boxlayout不会更改任何内容。我觉得这不正常,因为我正在为面板设置一个perferred大小?但是如果我删除panel.setPreferredSize(新的维度((int)(screenSize.width*0.7-50),screenSize.height-150)这一行当没有文本时,标签会变小,并且会变大以适应文

这个问题与此非常相似:我尝试了这个解决方案,但它不起作用

当我将jlabel添加到jscrollpane时,当jlabel很小时,标签将居中。当滚动条显示时,它工作正常。设置boxlayout不会更改任何内容。我觉得这不正常,因为我正在为面板设置一个perferred大小?但是如果我删除panel.setPreferredSize(新的维度((int)(screenSize.width*0.7-50),screenSize.height-150)这一行当没有文本时,标签会变小,并且会变大以适应文本,这是我不想要的。如果我添加面板而不是标签,那么即使没有文本,屏幕也可以滚动

这是我的代码:

公共类测试{
//JFrame
静态JFrame=新JFrame(“测试”);
//小组1
静态JPanel面板=新JPanel(新BorderLayout());
//显示文本的标签
静态JLabel标签=新JLabel();
//主方法中的滚动面板
公共静态void main(字符串[]args)引发异常{
维度screenSize=Toolkit.getDefaultToolkit().getScreenSize();
标签.新订单(新的空订单(5,5,5,20));
label.setText(“任何文本使其居中超过40行”);
//创建面板
panel.setLayout(新的BoxLayout(panel,BoxLayout.Y_轴));
面板。添加(标签,边框布局。北);
panel.add(Box.createVerticalGlue());
面板设置首选尺寸(新尺寸((int)(屏幕尺寸.宽度*0.7-50),屏幕尺寸.高度-150);
专家组命令(新的清空命令(5,5,5,10));
JScrollPane jspanel=新的JScrollPane(标签,ScrollPaneConstants.VERTICAL\u SCROLLBAR\u,根据需要,ScrollPaneConstants.HORIZONTAL\u SCROLLBAR\u NEVER);
//jspanel.add(标签,BorderLayout.CENTER);
jspanel.setPreferredSize(新尺寸((int)(屏幕尺寸.宽度*0.7-70),屏幕尺寸.高度-180));
jspanel.getVerticalScrollBar().setUnitIncrement(20);
jspanel.setBorder(BorderFactory.createEmptyBorder());
jspanel.setAlignmentX(JScrollPane.LEFT_对齐);
jspanel.setAlignmentY(JScrollPane.TOP_对齐);
//面板。设置首选尺寸(新尺寸(640480));
//框架。添加(面板);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(jspanel);
帧设置大小((int)(屏幕大小.宽度*0.7),屏幕大小.高度-50);
frame.revalidate();
frame.pack();
frame.setVisible(true);
}
}
这将在其父容器中对齐滚动窗格,具体取决于所使用的布局管理器。它不会影响添加到滚动窗格的任何组件的对齐。这是不必要的

标签居中

标签的大小可以填充整个可用空间,因此需要自定义标签文本的绘制方式

如果不希望将其居中,则可以使用以下方法将其放置在顶部:

label.setVerticalAlignment( SwingConstants.TOP );

在重新编写代码之后,我提出了以下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;
        }
        
    }
    

    张贴一个适当的演示你的问题。您的问题是关于在JScrollPane中显示标签。自定义字体不相关,应删除。自定义ScrollBarUI与此无关,应将其删除。首先让代码使用标准类,以确保问题不在自定义类中。其他建议:1)不要使用setPreferredSize()。硬编码尺寸时,滚动将不起作用。2) 不需要使用revalidate()。调用pack()/setVisible()时,将调用布局管理器,并为组件指定大小/位置。那么setPreferredSize是问题所在吗?滚动工作,但标签在中心。它是最小的复制现在?哼。。。我试过了,但它仍然居中。我复制并粘贴了MRE中的代码,并添加了一行代码,文本显示在滚动窗格的左上角。张贴您更新的MRE。谢谢,我找到了应该放置label.setVerticalAlignment的位置,现在可以使用了。(我太激动了)
    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;
        }
        
    }