【问题标题】:JScrollPane components are invisible until I click themJScrollPane 组件在我单击它们之前是不可见的
【发布时间】:2021-07-16 21:45:14
【问题描述】:

所以,我尝试将组件添加到JScrollPane,但它们仅在我将鼠标悬停在它们上方时才会出现。 这是我的代码:

package com.alex.apps;

import java.awt.CardLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ScrollPaneLayout;

public class main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //GetPageInfo gpi=new GetPageInfo();
        JFrame frame=new JFrame("Bookmark");
        JScrollPane pane = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        frame.setContentPane(pane);
        
        JTextField text=new JTextField();
        text.setBounds(0, 10, 400, 40);
        pane.add(text);
        
        JButton add=new JButton("+");
        add.setBounds(403, 10, 40, 40);
        pane.add(add);
        
        
        frame.setSize(480, 860);
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

}

你知道为什么它不起作用吗?

【问题讨论】:

    标签: java swing jscrollpane


    【解决方案1】:

    我在您的代码中发现了几个问题:

    1. public class main {,类应该以大写字母开头,后面跟着Java naming conventions,这会让你的代码更容易被你和其他人阅读和跟踪,而且main是所有Java类的入口点方法的名称,所以这可能会令人困惑
    • FirstWordUpperCasedClass
    • firstWordLowerCasedVariable
    • firstWordLowerCasedMethod()
    • ALL_WORDS_UPPER_CASED_CONSTANT
    1. .setBounds(...),在你的情况下,你使用默认的Layout Managers,所以这些调用被简单地忽略,除非你有充分的理由(在这个程序中你没有)不使用布局管理器,坚持这些经理,如果需要,将它们组合起来。

    2. 不要直接在你的JFrame 上调用setSize(...),这会将窗户装饰变成这个大小,而是为JPanel 设置一个preferredSize,并将JPanel 添加到你的JFrame ,然后在您的JFrame 上致电pack(),请参阅:Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing? 以获得更深入的说明。

    3. 在同一问题中补充@camickr 在他的answer 中,以及您在那里发表的评论:

    但现在按钮占据了整个窗格。

    您正在尝试添加 JTextFieldJButton,并从 setBounds(...) 电话我看到您正在尝试添加 + JTextField 右侧的按钮,所以在这种情况下,只需添加 将JTextFieldJButton 都设置为一个全新的JPanel,然后将JScrollPane 的视口设置为这个新的JPanel

    @camickr 建议将视口设置为JButton,这就是为什么JButton 占据了整个空间。

    1. 使用数字参数创建JTextField,这将告诉 Swing 您要在其上显示的列(或字符)的数量,而不是一个空的。

    2. 最后但同样重要的是,将您的程序放在Event Dispatch Thread (EDT) 上,有关更多信息,请参阅this answer 中的第 2 点。

    在遵循上述所有建议之后,您将拥有更好的代码:

    import java.awt.Dimension;
    
    import javax.swing.BoxLayout;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextField;
    import javax.swing.SwingUtilities;
    
    public class ScrollPaneSample {
        private JFrame frame;
        private JPanel pane;
        private JScrollPane scrollPane;
        private JTextField text;
        private JButton add;
        
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new ScrollPaneSample()::createAndShowGUI);
        }
        
        private void createAndShowGUI() {
            frame = new JFrame("Bookmark");
            pane = new JPanel() {
                @Override
                public Dimension getPreferredSize() {
                    return new Dimension(200, 100);
                }
            };
            scrollPane = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                    JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    
            text = new JTextField(10);
            pane.add(text);
    
            add = new JButton("+");
            pane.add(add);
    
            scrollPane.setViewportView(pane);
            
            frame.add(scrollPane);
            
            frame.pack();
            frame.setResizable(false);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        }
    }
    

    我现在让getPreferredSize(...) 返回一个较小的尺寸,因为对于本示例来说它是一个太大的窗口,您可以根据自己的需要调整它的大小。

    【讨论】:

    • 非常感谢!这对我很有帮助。
    • 很高兴能提供帮助,请务必查看其他链接 :)
    【解决方案2】:
    pane.add(add);
    

    不要将组件直接添加到滚动窗格中。

    相反,您需要将组件添加到滚动窗格的视口:

    //pane.add(add);
    pane.setViewportView( add );
    

    阅读 How to Use Scroll Panes 上的 Swing 教程部分,了解滚动窗格的工作原理。

    【讨论】:

    • 但是现在按钮占据了整个窗格。
    • 将按钮添加到面板,将面板添加到滚动窗格。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    相关资源
    最近更新 更多