gpt4 book ai didi

java - JFrame 在滚动面板中显示标签

转载 作者:行者123 更新时间:2023-12-01 07:18:26 24 4
gpt4 key购买 nike

我正在制作一个需要在滚动面板中显示标签的框架,但添加标签后滚动不起作用。

Example

    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 个。

我不知道如何用谷歌搜索它!

最佳答案

您的基本问题是,您不了解布局管理 API 的工作原理,也不了解当您选择放弃它时如何替换其功能。

你的问题从这里开始:

roomList.setLayout(null);

后台正在进行大量的工作,为 API 的各个部分提供了大量的信息,而从表面上看,布局管理 API 并不复杂,它所扮演的角色却很复杂。

JScrollPane 将使用组件的 preferredSize 来确定何时应显示滚动条。由于您已经取消了这种自动计算,因此 JScrollPane 没有什么可继续的

有关更多信息,请查看Laying Out Components Within a Container

作为一个简单的例子......

Simple Scroll Example

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 接口(interface),这并不总是必需的,但在本例中用于向 JScrollPane 提供有关首选大小的提示它应该使用的可视区域,否则它将尝试使用组件的 preferredSize

但是,正如已经建议的那样,您还可以使用其他更简单且更优化的解决方案。

如果您的信息足够简单,您可以使用 JList 以垂直方式列出多个值,请参阅 How to use Lists了解更多详情。

如果您的信息采用更复杂的结构,您可以使用 JTable,它提供行和列样式结构。请参阅How to use tables了解更多信息

关于java - JFrame 在滚动面板中显示标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49036909/

24 4 0