У меня есть JPanel
внутри JScrollPane
внутри GridBagLayout
, не прокрутке должным образом. Что должно произойти, так это то, что каждый раз, когда нажата кнопка xxx xxx, в области прокрутки добавляется новая строка. Что на самом деле происходит, так это то, что если xxx нажата, скажем, 10 раз, появляются только первые семь строк, а остальные не могут быть прокручены. Может ли кто-нибудь предложить изменения к исходному коду ниже, что приведет к правильной прокрутке ? Я потратил несколько часов на это без успеха, пробовал стратегии всего через Интернет.JPanel внутри от JScrollPane внутри GridBagLayout не прокручивать правильно
Примечания:
- Текст разделен на
paintComponent
, потому чтоdrawString
делает не справиться с конца-строки символов. JPanel
внутриJScrollPane
внутриGridBagLayout
конфигурация является необходимой частью гораздо более крупного программного обеспечения с той же проблемой, поэтому я сохранил его здесь.
Спасибо.
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();
}
}
}
}
Пожалуйста, см редактировать ответить. –
............... привет? –
Спасибо. ScrollingPane2 был тем, что мне нужно. –