我有一个JFrame(frame
)和一个JScrollbox。JScrollbox包含我的ContainerJComponent(DebugPanel
)。这个ContainerJComponent包含JScriptItem(DebugItem
)。这是一个从我的项目中抽象出来的问题,目的是为了理解。
FRAME我创建一个JFrame。For循环用于为面板创建示例项。
public class DebugGUI {
private static JFrame frame;
private static DebugPanel panel = new DebugPanel();
public static void generateGUI() {
frame = new JFrame();
for (int i = 1; i < 20; i++) {
panel.addItem(0.2);
}
frame.setContentPane(new JScrollPane(panel, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS));
frame.setVisible(true);
}
}
字符串
PANEL为了简单起见,本例中的面板占据了整个JFrame区域。面板作为一个容器,容器中包含项目-在本例中,通过For循环添加了20个项目。
public class DebugPanel extends JComponent {
private static final long serialVersionUID = -7384855597611519487L;
private LinkedList<DebugItem> items = new LinkedList<>();
public DebugPanel() {
GridLayout layout = new GridLayout();
layout.setRows(1);
this.setLayout(layout);
}
public void addItem(double widthRatio) {
DebugItem item = new DebugItem(widthRatio);
items.add(item);
add(item);
}
@Override
protected void paintComponent(Graphics g) {
this.setPreferredSize(new Dimension((int) getPreferredSize().getWidth(), getParent().getHeight()));
super.paintComponent(g);
for (DebugItem item : items) {
item.resize((int) getPreferredSize().getHeight());
}
}
}
型
项目项目应该在面板中绘制一些东西。在我的例子中,这是一个矩形。这个矩形应该填满面板的整个高度,并保持一定的宽度相对于高度。
public class DebugItem extends JComponent {
private static final long serialVersionUID = 1630268284249666775L;
private double widthRatio;
private int width;
DebugItem(double widthRatio) {
this.widthRatio = widthRatio;
}
void resize(int height) {
width = (int) (height * widthRatio);
}
@Override
protected void paintComponent(Graphics g) {
// TODO Auto-generated method stub
super.paintComponent(g);
g.setColor(Color.RED);
g.drawRect(0, 0, width, getParent().getHeight());
}
}
型
然而,要绘制的比例并没有被考虑在内。JScrollbox是无用的,因为所有的项目总是填满面板。有人知道一个提示吗?类是孤立工作的。代码是完整的,除了对包的引用和导入。只需在main方法中调用generateGUI()。
1条答案
按热度按时间nmpmafwu1#
在我看来,你想要一个完全填满JScrollbar高度的面板,而添加到该面板的组件的宽度与高度相关。因此,你永远不会有垂直滚动条。
如果是这样,那么我认为你可以使用Scrollable Panel。这将允许面板填充滚动窗格。由于高度将是已知的,其他组件的宽度可以计算。
基本示例:
字符串