JFrame 在滚动面板中显示标签
JFrame show labels in a scroll panel
我正在制作一个需要在滚动面板中显示标签的框架,但在我添加标签后滚动不起作用。
JScrollPane scrollPane = new JScrollPane();
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scrollPane.setBounds(1, 1, 210, 259);
panel.add(scrollPane);
JPanel roomList = new JPanel();
scrollPane.setViewportView(roomList);
roomList.setLayout(null);
int x=0;
for(String l : list) {
JLabel c = new JLabel(l+" "+x);
c.setBounds(new Rectangle(1, 1+x*11, 191, 14));
roomList.add(c);
x++;
}
我确定列表中有 22 个以上。
我不知道如何google!
您尝试过使用 jLists 而不是 JScrollPanes 吗?
它们很容易实现,看起来很棒,而且工作起来很有魅力。
DefaultListModel model = new DefaultListModel();
for(String l : list) {
model.addElement(l);
}
yourList.setModel(model);
其中 list
是包含房间数据的列表,yourList
是 jList。
你的基本问题是,你不了解布局管理 API 是如何工作的,或者当你选择放弃它时如何替换它的功能。
你的问题从这里开始:
roomList.setLayout(null);
后台有很多工作在为API的各个部分提供大量信息,而从表面上看,布局管理API并不复杂,它所起的作用是。
JScrollPane
将使用组件的 preferredSize
来确定何时显示滚动条。既然你已经取消了这个自动计算,JScrollPane
就没有什么可以继续的了
有关详细信息,请查看 Laying Out Components Within a Container
作为一个简单的例子...
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Rectangle;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.Scrollable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JScrollPane scrollPane = new JScrollPane(new TestPane());
frame.add(scrollPane);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel implements Scrollable {
public TestPane() {
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
for (int index = 0; index < 100; index++) {
add(new JLabel("Row " + index), gbc);
gbc.gridy++;
}
}
@Override
public Dimension getPreferredScrollableViewportSize() {
return new Dimension(100, 50);
}
@Override
public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) {
return 32;
}
@Override
public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) {
return 32;
}
@Override
public boolean getScrollableTracksViewportWidth() {
return getPreferredSize().width <= getWidth();
}
@Override
public boolean getScrollableTracksViewportHeight() {
return false;
}
}
}
此示例实现了 Scrollable
接口,这并不总是必需的,但对于此示例,用于向 JScrollPane
提供有关可视区域的首选大小的提示应该使用,否则它将尝试使用组件的 preferredSize
.
但是,正如已经建议的那样,还有其他更简单、更优化的解决方案可供您使用。
如果您的信息足够简单,您可以使用 JList
以垂直方式列出多个值,有关详细信息,请参阅 How to use Lists。
如果您的信息采用更复杂的结构,您可以使用 JTable
,它提供了行和列样式的结构。有关详细信息,请参阅 How to use tables
我正在制作一个需要在滚动面板中显示标签的框架,但在我添加标签后滚动不起作用。
JScrollPane scrollPane = new JScrollPane();
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scrollPane.setBounds(1, 1, 210, 259);
panel.add(scrollPane);
JPanel roomList = new JPanel();
scrollPane.setViewportView(roomList);
roomList.setLayout(null);
int x=0;
for(String l : list) {
JLabel c = new JLabel(l+" "+x);
c.setBounds(new Rectangle(1, 1+x*11, 191, 14));
roomList.add(c);
x++;
}
我确定列表中有 22 个以上。
我不知道如何google!
您尝试过使用 jLists 而不是 JScrollPanes 吗?
它们很容易实现,看起来很棒,而且工作起来很有魅力。
DefaultListModel model = new DefaultListModel();
for(String l : list) {
model.addElement(l);
}
yourList.setModel(model);
其中 list
是包含房间数据的列表,yourList
是 jList。
你的基本问题是,你不了解布局管理 API 是如何工作的,或者当你选择放弃它时如何替换它的功能。
你的问题从这里开始:
roomList.setLayout(null);
后台有很多工作在为API的各个部分提供大量信息,而从表面上看,布局管理API并不复杂,它所起的作用是。
JScrollPane
将使用组件的 preferredSize
来确定何时显示滚动条。既然你已经取消了这个自动计算,JScrollPane
就没有什么可以继续的了
有关详细信息,请查看 Laying Out Components Within a Container
作为一个简单的例子...
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Rectangle;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.Scrollable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JScrollPane scrollPane = new JScrollPane(new TestPane());
frame.add(scrollPane);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel implements Scrollable {
public TestPane() {
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
for (int index = 0; index < 100; index++) {
add(new JLabel("Row " + index), gbc);
gbc.gridy++;
}
}
@Override
public Dimension getPreferredScrollableViewportSize() {
return new Dimension(100, 50);
}
@Override
public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) {
return 32;
}
@Override
public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) {
return 32;
}
@Override
public boolean getScrollableTracksViewportWidth() {
return getPreferredSize().width <= getWidth();
}
@Override
public boolean getScrollableTracksViewportHeight() {
return false;
}
}
}
此示例实现了 Scrollable
接口,这并不总是必需的,但对于此示例,用于向 JScrollPane
提供有关可视区域的首选大小的提示应该使用,否则它将尝试使用组件的 preferredSize
.
但是,正如已经建议的那样,还有其他更简单、更优化的解决方案可供您使用。
如果您的信息足够简单,您可以使用 JList
以垂直方式列出多个值,有关详细信息,请参阅 How to use Lists。
如果您的信息采用更复杂的结构,您可以使用 JTable
,它提供了行和列样式的结构。有关详细信息,请参阅 How to use tables