Java Swing 滚动浏览绘图
Java Swing Scroll through drawing
我正在尝试将 JScrollpane 添加到我的 JPanel。问题是滚动窗格无法识别我的绘图在框架之外。那么如何正确添加 JScrollpane 呢?
主要class:
public MainFrame() extends JFrame{
public MainFrame() {
Container container = getContentPane();
container(new BorderLayout());
container.add(new JScrollPane(new Drawing()));
setSize(1280,720);
setVisible(true);
}
画图class:
public class Drawing() extends JPanel {
@Override
protected void paintComponent(Graphics g) {
g.drawLine(10, 100, 30000, 10);
}
}
您的代码中有几个错误,让我们逐步解决每个错误:
您正在扩展 JFrame
,您应该避免它,请参阅:Extends JFrame vs. creating it inside the program 了解更多信息。你实际上并没有改变它的行为,所以不需要扩展它。
为了使 JScrollPane
显示整行,您需要将 window 的大小更改为与行的大小相同(如 this answer @MadProgrammer).
与第 2 点相关,避免使用 setSize(...)
而是覆盖 getPreferredSize()
:有关详细信息,请参阅 Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?
您忘记在 paintComponent()
方法中调用 super.paintComponent(...)
方法。
关于第 2、3 点,您需要调用 pack()
,以便 Swing 计算出您的组件的最佳首选大小。
看这个例子:
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
public class LongDraw {
private JFrame frame;
private Drawing drawing;
public static void main(String[] args) {
SwingUtilities.invokeLater(new LongDraw()::createAndShowGui);
}
private void createAndShowGui() {
frame = new JFrame(getClass().getSimpleName());
drawing = new Drawing();
JScrollPane scroll = new JScrollPane(drawing);
frame.add(scroll);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
class Drawing extends JPanel {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.drawLine(10, 100, 3000, 10);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(3000, 500);
}
}
}
产生类似这样的东西:
我正在尝试将 JScrollpane 添加到我的 JPanel。问题是滚动窗格无法识别我的绘图在框架之外。那么如何正确添加 JScrollpane 呢?
主要class:
public MainFrame() extends JFrame{
public MainFrame() {
Container container = getContentPane();
container(new BorderLayout());
container.add(new JScrollPane(new Drawing()));
setSize(1280,720);
setVisible(true);
}
画图class:
public class Drawing() extends JPanel {
@Override
protected void paintComponent(Graphics g) {
g.drawLine(10, 100, 30000, 10);
}
}
您的代码中有几个错误,让我们逐步解决每个错误:
您正在扩展
JFrame
,您应该避免它,请参阅:Extends JFrame vs. creating it inside the program 了解更多信息。你实际上并没有改变它的行为,所以不需要扩展它。为了使
JScrollPane
显示整行,您需要将 window 的大小更改为与行的大小相同(如 this answer @MadProgrammer).与第 2 点相关,避免使用
setSize(...)
而是覆盖getPreferredSize()
:有关详细信息,请参阅 Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?您忘记在
paintComponent()
方法中调用super.paintComponent(...)
方法。关于第 2、3 点,您需要调用
pack()
,以便 Swing 计算出您的组件的最佳首选大小。
看这个例子:
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
public class LongDraw {
private JFrame frame;
private Drawing drawing;
public static void main(String[] args) {
SwingUtilities.invokeLater(new LongDraw()::createAndShowGui);
}
private void createAndShowGui() {
frame = new JFrame(getClass().getSimpleName());
drawing = new Drawing();
JScrollPane scroll = new JScrollPane(drawing);
frame.add(scroll);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
class Drawing extends JPanel {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.drawLine(10, 100, 3000, 10);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(3000, 500);
}
}
}
产生类似这样的东西: