gpt4 book ai didi

java - GridBagLayout 内的 JScrollPane 内的 JPanel 无法正确滚动

转载 作者:行者123 更新时间:2023-12-01 09:17:04 25 4
gpt4 key购买 nike

我在 GridBagLayout 内的 JScrollPane 内有一个 JPanel那没有正确滚动。应该发生的是,每次按下 xxx 按钮,滚动 Pane 内将添加新行。实际发生的情况是,如果按 xxx,比如说 10 次,只有前七行显示,其余的无法滚动。任何人都可以建议更改下面的源代码,以使滚动行为正常适本地?我花了几个小时在这上面,但没有成功,尝试了所有策略通过网络。

注释:

  1. 文本在 paintComponent 中分割,因为 drawString 确实如此不处理行尾字符。
  2. GridBagLayout 配置中 JScrollPane 内的 JPanel 是更大的组件的必要组成部分一个软件也有同样的问题,所以我把它放在这里。

谢谢。

import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class question {

public static void main(String[] args) {
new DrawingGUI();
}

private static class ScrollingPane extends JPanel {
private static final long serialVersionUID = 1L;

String text;

public ScrollingPane() {
setPreferredSize(new Dimension(300, 100));
text = "";
}

public void SetText(String text_x) {text = text + System.lineSeparator() + text_x;}

public void paintComponent(Graphics g) {
super.paintComponent(g);
FontMetrics fm = g.getFontMetrics();

int y = -fm.getHeight();
for (String text : text.split("\n"))
g.drawString(text, 0, y += fm.getHeight());
}
}

static class DrawingGUI extends JFrame implements ActionListener {
private static final long serialVersionUID = 1L;

JPanel jp;
JScrollPane js;
ScrollingPane sp;

int LineNum;

DrawingGUI() {
LineNum = 0;
JFrame frame = new JFrame("xxx");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

addComponentsToPane(frame.getContentPane());

frame.setSize(800,800);
frame.setVisible(true);
}

public void addComponentsToPane(Container pane) {
pane.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();

JButton button = new JButton("xxx");
button.setActionCommand("add_text");
button.addActionListener(this);
c.gridx = 0;
c.gridy = 0;
pane.add(button, c);

jp = new JPanel();
c.gridx = 0;
c.gridy = 1;
c.ipadx = 600;
c.ipady = 450;
pane.add(jp, c);

sp = new ScrollingPane();

js = new JScrollPane(sp);
js.getViewport().setPreferredSize(new Dimension(300,100));
c.gridx = 0;
c.gridy = 2;
c.ipady = 50;
pane.add(js, c);
}

public void actionPerformed(ActionEvent e) {
if ("add_text".equals(e.getActionCommand())) {
LineNum++;
sp.SetText("LineNum = " + LineNum);
sp.revalidate();
sp.repaint();
}
}
}

}

最佳答案

您使用此行短路了 ScrollingPane JPanel 正确调整自身大小的能力:

setPreferredSize(new Dimension(300, 100));

这将修复 ScrollingPane JPanel 的大小。我发现您有几种可能的解决方案:

  1. 困难:重写 ScrollingPane JPanel 的 getPreferredSize(),并根据其保存的文本大小计算适当的首选大小,并使用 FontMetrics 绘制。
  2. 更简单:不要像您正在做的那样添加文本,而是让 ScrollingPane 使用 GridLayout(0, 1)(一列,可变行数),并在需要新文本时将 JLabels 添加到 ScrollingPane被添加。然后调用 revalidate()repaint()
  3. 更简单:不要使用 ScrollingPane JPanel,而是使用 JTextArea,它看起来像 JPanel 并且无法编辑。将其添加到 JScrollPane,并再次强调,不要限制其大小
  4. 最简单:只需使用 JList,因为这就是您在此处使用的功能。

例如,其中任何一个都可以工作并且看起来相似:

private static class ScrollingPane2 extends JPanel {
private static final long serialVersionUID = 1L;
private JTextArea textArea = new JTextArea(6, 20);

public ScrollingPane2() {
setLayout(new BorderLayout());
add(textArea, BorderLayout.CENTER);
textArea.setEditable(false);
textArea.setFocusable(false);
textArea.setBackground(null);
}

public void SetText(String text_x) {
textArea.append(text_x + "\n");
}
}

private static class ScrollingPane3 extends JPanel {
private static final long serialVersionUID = 1L;
private DefaultListModel<String> listModel = new DefaultListModel<>();
private JList<String> jList = new JList<>(listModel);

public ScrollingPane3() {
setLayout(new BorderLayout());
add(jList, BorderLayout.CENTER);
jList.setBackground(null);
}

public void SetText(String text_x) {
listModel.addElement(text_x);
}
}

关于java - GridBagLayout 内的 JScrollPane 内的 JPanel 无法正确滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40469540/

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