jscrollpane组件在我单击它们之前是不可见的

cvxl0en2  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(347)

所以,我尝试添加组件到 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);
    }

}

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

qvk1mo1f

qvk1mo1f1#

pane.add(add);

不要直接向滚动窗格添加组件。
相反,您需要将组件添加到滚动窗格的视口中:

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

阅读swing教程中有关如何使用滚动窗格的部分,了解滚动窗格的工作原理。

9wbgstp7

9wbgstp72#

我在您的代码中看到几个问题: public class main { ,类应该以大写字母开头,遵循java命名约定,这将使您的代码更易于阅读,也便于您和其他人理解 main 是所有java类的入口点方法的名称,因此这可能会造成混淆 FirstWordUpperCasedClass firstWordLowerCasedVariable firstWordLowerCasedMethod() ALL_WORDS_UPPER_CASED_CONSTANT .setBounds(...) ,在您的情况下,您使用的是默认的布局管理器,因此这些调用将被忽略,除非您有充分的理由(在本程序中您没有)不使用布局管理器,否则请坚持使用这些管理器,并在需要时合并它们。
不要打电话 setSize(...) 直接在你的 JFrame ,这将把Windows装饰成这个尺寸,而不是设置一个 preferredSize 为了一个 JPanel 再加上 JPanel 给你的 JFrame ,然后打电话 pack() 在你的 JFrame ,请参阅:我是否应该避免在JavaSwing中使用set(首选的| maximum | minimum)size方法?更深入的解释。
补充@camickr对同一问题的回答,以及你的评论:
但现在按钮占据了整个窗格。
你想添加一个 JTextField 和一个 JButton ,从 setBounds(...) 我看到你想把 + 按钮的右边 JTextField ,因此在本例中,只需将 JTextField 以及 JButton 到一个全新的 JPanel 然后设置 JScrollPane 的视口到新的 JPanel .
@camickr建议将视口设置为 JButton 所以你才有 JButton 占据整个空间。
创建 JTextField 带有一个number参数,它将告诉swing要在其上显示的列数(或字符数),而不是一个空的列数。
最后但并非最不重要的一点是,将您的程序放在事件调度线程(edt)上,有关更多信息,请参阅本答案中的第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(...) 现在返回一个较小的大小,因为对于本例来说它是一个太大的窗口,您可以根据自己的需要调整它的大小。

相关问题