java - 在 JScrollPane 内的 JPanel 上绘画不会在正确的位置绘画

标签 java swing jpanel jscrollpane draw

所以我在 JScrollPane 中有一个 JPanel。 现在我想在面板上画一些东西,但它总是在同一个地方。 我可以向各个方向滚动,但它没有移动。无论我在面板上绘制什么都不会滚动。

我已经试过了:

  1. 自定义 JViewPort
  2. 在 Opaque = true 和 Opaque = false 之间切换

我还考虑过重写面板的 paintComponent 方法,但这在我的代码中很难实现。

public class ScrollPanePaint{

public ScrollPanePaint() {
    JFrame frame = new JFrame();
    final JPanel panel = new JPanel();
    panel.setPreferredSize(new Dimension(1000, 1000));
    //I tried both true and false
    panel.setOpaque(false);
    JScrollPane scrollPane = new JScrollPane(panel);
    frame.add(scrollPane);
    frame.setSize(200, 200);
    frame.setVisible(true);
    //To redraw the drawing constantly because that wat is happening in my code aswell because
    //I am creating an animation by constantly move an image by a little
    new Thread(new Runnable(){
        public void run(){
            Graphics g = panel.getGraphics();
            g.setColor(Color.blue);
            while(true){
                g.fillRect(64, 64, 3 * 64, 3 * 64);
                panel.repaint();
            }
        }
    }).start();
}

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {

        @Override
        public void run() {
            new ScrollPanePaint();
        }
    });
}

我犯的错误可能很容易改正,但我就是不知道怎么改正。

最佳答案

如何在JPanel上实现paintComponent()

覆盖 getPreferredSize() 方法而不是使用 setPreferredSize()

final JPanel panel = new JPanel(){
    @Override
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        // your custom painting code here
    }

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

几点:

  1. 覆盖 JComponent#getPreferredSize()而不是使用 setPreferredSize()

    阅读更多 Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?

  2. 使用 Swing Timer而不是 Java Timer更适合Swing应用。

    阅读更多 How to Use Swing Timers

  3. 使用 UIManager.setLookAndFeel() 设置默认外观

    阅读更多 How to Set the Look and Feel

  4. How to fix animation lags in Java?

关于java - 在 JScrollPane 内的 JPanel 上绘画不会在正确的位置绘画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23974009/

相关文章:

java - Jframe 上的嵌套 Jpanel 中的问题

java - Keycloak:订阅事件,例如创建用户以触发网络服务

java - 在 java 中重新排序 JTabbedPane 中的选项卡

java - 将 jbutton 和 jlabel 数组添加到 jpanel 数组到框架中时出现问题

java - 不明白为什么我的代码中显示以下错误: non-static variable cannot be referenced from a static context

java - 在 JScrollPane 内的 JPanel 上绘图

java - 签名的 jar 文件无法识别 java u_121

java - 如何构建一个可插入的java应用程序?

java - 如何阻止我的日志文件相互添加?

java - 如何使用 Graphics#fillOval 的中心作为引用在中心绘制随机圆