gpt4 book ai didi

java - 如何在 JPanel 中为长 JComponent 添加滚动条?如何使 JComponent 居中?

转载 作者:行者123 更新时间:2023-12-02 09:03:59 24 4
gpt4 key购买 nike

目前,我必须将 JComponent 包含在具有垂直框布局的 JPanel 中。这样,我可以将第一个组件居中,如下所示,并将底部组件(相当长)放在下面。但是,由于底部组件非常长,我想仅为该特定组件添加一个 slider 。这样,用户可以看到所有底部组件,而上部组件保持居中。但是,我下面的代码没有修复任何问题,并且滚动条甚至无法工作。您需要了解的有关 GPComponent 和 GPinfinity 的唯一信息是它们重写了 PreferredSize、minimumSize、maximumSize 和 PaintComponent 方法(它们扩展了 JComponent)。 enter image description here

JFrame frame = new JFrame();
JPanel panel = new JPanel();

GPComponent gp = new GPComponent(n, k);
GPinfinityComponent gpi = new GPinfinityComponent(n, k);

Box box = new Box(BoxLayout.Y_AXIS);

panel.add(Box.createVerticalGlue());
panel.add(gp);
panel.add(Box.createVerticalGlue());
JScrollPane thePane = new JScrollPane(gpi, JScrollPane.VERTICAL_SCROLLBAR_NEVER,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
panel.add(thePane);

frame.pack();6
frame.add(panel, BorderLayout.CENTER); // just to be clear
frame.setVisible(true);
final int FRAME_WIDTH = 600;
final int FRAME_HEIGHT = 600;
frame.setSize(FRAME_WIDTH, FRAME_HEIGHT);
frame.setTitle("GP("+n+", "+k+")");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);

另外:两个组件的maximumSize=minimumSize=preferredSize对于圆形,尺寸为 (350, 350),对于另一个,尺寸为 (5000, 150)。

最佳答案

您声明:

...and for the other the dimensions are (5000, 150).

如果这是应该显示滚动条的组件,那么 Java 会告诉您,它实际上比您想象的要短得多。我想知道您是否设置的是 size 而不是 PreferredSize。实际上,您不应该设置其中任何一个,而是应该重写 getPreferredSize() 并让它返回适合组件的尺寸。

如需更详细的帮助,请考虑创建并发布 minimal example program .

<小时/>

编辑
例如,我的 MCVE:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import java.awt.RenderingHints;

import javax.swing.*;

@SuppressWarnings("serial")
public class PreferredSizeEg extends JPanel {
private static final int PREF_W = 800;
private static final int PREF_H = 600;

public PreferredSizeEg() {
JPanel centerPanel = new JPanel(new GridBagLayout());
centerPanel.add(new CenterImagePanel());

JScrollPane scrollpane = new JScrollPane(new LongImagePanel(),
JScrollPane.VERTICAL_SCROLLBAR_NEVER,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

setLayout(new BorderLayout());
add(centerPanel, BorderLayout.CENTER);
add(scrollpane, BorderLayout.PAGE_END);
}

@Override
public Dimension getPreferredSize() {
return new Dimension(PREF_W, PREF_H);
}

private class LongImagePanel extends JPanel {
private static final int LI_PREF_W = 5000;
private static final int LI_PREF_H = 150;

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);

int index = 0;
int spriteWidth = 50;
while ((index) * spriteWidth < getWidth()) {
Color c = index % 2 == 0 ? Color.green : Color.red;
g.setColor(c);
int x = 2 + index * spriteWidth;
int y = 2;
int width = getHeight() - 4;
int height = width;
g.fillOval(x, y, width, height);
index++;
}
}

@Override
public Dimension getPreferredSize() {
return new Dimension(LI_PREF_W, LI_PREF_H);
}
}

private class CenterImagePanel extends JPanel {
private static final int CIP_PREF_W = 200;
private static final int CIP_PREF_H = CIP_PREF_W;

public CenterImagePanel() {
setBorder(BorderFactory.createLineBorder(Color.BLACK));
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g.setColor(Color.green);
int x = 5;
int y = x;
int width = getWidth() - 2 * x;
int height = getHeight() - 2 * y;
g.fillOval(x, y, width, height);
}

@Override
public Dimension getPreferredSize() {
return new Dimension(CIP_PREF_W, CIP_PREF_H);
}
}

private static void createAndShowGui() {
PreferredSizeEg mainPanel = new PreferredSizeEg();

JFrame frame = new JFrame("PreferredSizeEg");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}

显示为:

enter image description here

关于java - 如何在 JPanel 中为长 JComponent 添加滚动条?如何使 JComponent 居中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24770777/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com