我是swing java应用程序的新手,我正在开发一个小型桌面应用程序,可以在运行时按下每个按钮创建jlabels。
问题是当jlabels数量过多时,我需要在jframe中显示一个滚动条,以使用户能够看到所有jlabels(在jframe的高度之后创建的jlabel)。
我尝试了jscroll窗格和jscroll栏但没有用,请提供完整的示例。
提前感谢您的努力。
答案 0 :(得分:2)
似乎对我有用,请发帖SSCCE以显示具体问题,唯一想到的是您将JLabel
添加到容器而不是JScrollPane
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
public class JLabelJScrollPaneTest {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame() {
@Override
public Dimension getPreferredSize() {//size frame purposefully smaller
return new Dimension(100, 100);
}
};
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel label = new JLabel("WWWWWWWWWoooooorrrrkkkk");
JScrollPane jsp = new JScrollPane(label);
frame.add(jsp);
frame.pack();
frame.setVisible(true);
}
});
}
}
<强>更新强>
我看到你说:
(jlabel在jframe的高度之后创建)。
所以我认为JFrame是可见的?如果是的话:
以下是一个示例,说明如何在显示JLabel
2秒后将JScrollPane
添加到JFrame
,最重要的是致电revalidate()
和repaint()
添加/删除/更改组件大小后在容器实例上。
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
public class JLabelJScrollPaneTest {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
final JFrame frame = new JFrame() {
@Override
public Dimension getPreferredSize() {
return new Dimension(100, 100);
}
};
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JScrollPane jsp = new JScrollPane();
frame.add(jsp);
frame.pack();
frame.setVisible(true);
Timer t= new Timer(2000, new AbstractAction() {//create timer to add JLabel to scrollPane after 2 seconds
@Override
public void actionPerformed(ActionEvent ae) {
final JLabel label = new JLabel("WWWWWWWWWoooooorrrrkkkk");
jsp.setViewportView(label);
//refelect changes
frame.revalidate();
frame.repaint();
}
});
t.setRepeats(false);
t.start();
}
});
}
}
UPADTE 2
根据评论它的完全相同的东西有微小的改动:
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
public class JLabelJScrollPaneTest {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
final JFrame frame = new JFrame() {
@Override
public Dimension getPreferredSize() {
return new Dimension(100, 100);
}
};
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JPanel labelPanel = new JPanel(new GridLayout(4, 1));
final JScrollPane jsp = new JScrollPane(labelPanel);
frame.add(jsp);
frame.pack();
frame.setVisible(true);
Timer t = new Timer(2000, new AbstractAction() {//create timer to add JLabel to scrollPane after 2 seconds
@Override
public void actionPerformed(ActionEvent ae) {
final JLabel label = new JLabel("WWWWWWWWWoooooorrrrkkkk");
final JLabel label2 = new JLabel("Try it");
final JLabel label3 = new JLabel("Noooooo reealllly");
final JLabel label4 = new JLabel("Yes");
labelPanel.add(label);
labelPanel.add(label2);
labelPanel.add(label3);
labelPanel.add(label4);
labelPanel.revalidate();
labelPanel.repaint();
}
});
t.setRepeats(false);
t.start();
}
});
}
}