所以,我尝试添加组件到 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);
}
}
你知道为什么它不起作用吗?
2条答案
按热度按时间qvk1mo1f1#
不要直接向滚动窗格添加组件。
相反,您需要将组件添加到滚动窗格的视口中:
阅读swing教程中有关如何使用滚动窗格的部分,了解滚动窗格的工作原理。
9wbgstp72#
我在您的代码中看到几个问题:
public class main {
,类应该以大写字母开头,遵循java命名约定,这将使您的代码更易于阅读,也便于您和其他人理解main
是所有java类的入口点方法的名称,因此这可能会造成混淆FirstWordUpperCasedClass
firstWordLowerCasedVariablefirstWordLowerCasedMethod()
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点。
在遵循以上所有建议之后,您会得到一个更好的代码,如以下代码:
我做的
getPreferredSize(...)
现在返回一个较小的大小,因为对于本例来说它是一个太大的窗口,您可以根据自己的需要调整它的大小。