【问题标题】:Java Swing Scroll through drawingJava Swing 滚动绘图
【发布时间】:2017-11-10 18:07:59
【问题描述】:

我正在尝试将 JScrollpane 添加到我的 JPanel。问题是滚动窗格无法识别我的绘图在框架之外。那么如何正确添加 JScrollpane 呢?

主类:

public MainFrame() extends JFrame{

public MainFrame() {

        Container container = getContentPane(); 
        container(new BorderLayout());
        container.add(new JScrollPane(new Drawing()));

        setSize(1280,720);
        setVisible(true);
    }

绘图类:

public class Drawing() extends JPanel {

    @Override
    protected void paintComponent(Graphics g) {
       g.drawLine(10, 100, 30000, 10);
    }
}

【问题讨论】:

  • 为了获得更好的帮助,请尽快发布正确的minimal reproducible example,您是否致电pack()?你在扩展JFrame 吗?这不是一个好主意:见extends JFrame vs calling it inside of class
  • 我的 MainFrame 扩展了 JFrame,我的 Drawing 类扩展了 JPanel。我没有调用 pack()。
  • 您是否阅读了这两个链接?需要 MCVE,因此我们可以更快更好地为您提供帮助
  • 我扩展了代码,重现了我的问题
  • 很可能,问题在于您的Drawing 面板与您的绘图30000X10 的大小不同。您必须专门设置它的大小,它不会根据您绘制的内容自动设置。

标签: java swing jscrollpane paintcomponent


【解决方案1】:

您的代码中有几个错误,让我们逐一检查:

  1. 您正在扩展JFrame,您应该避免使用它,有关它的更多信息,请参阅:Extends JFrame vs. creating it inside the program。你实际上并没有改变它的行为,所以不需要扩展它。

  2. 为了让您的JScrollPane 显示整行,您需要将窗口的大小更改为与您的行相同的大小(如@MadProgrammer 的this answer 所示)。

    李>
  3. 与第 2 点相关,避免使用setSize(...),而是覆盖getPreferredSize():有关详细信息,请参阅Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?

  4. 您忘记在paintComponent() 方法中调用super.paintComponent(...) 方法。

  5. 与第 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);
        }
    }
}

这会产生类似的东西:

【讨论】:

    猜你喜欢
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-21
    • 2017-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多