【问题标题】:paintComponent problems displayingpaintComponent 问题显示
【发布时间】:2015-04-10 00:55:04
【问题描述】:

我在尝试显示我要绘制的三角形时遇到了麻烦。我查看了网络,发现我实施的许多选项都没有解决我的显示问题。我的按钮面板显示完美,但用于绘图的 JPanel 要么没有被使用,要么没有被绘制。你们可以提供的任何帮助都会很棒,我已经盯着看了几天,没有任何运气。我有更多代码要实现,但我想在添加太多代码之前运行我的代码。这是我的代码,感谢您提前提供任何帮助。

    import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.geom.Point2D;

import javax.swing.*;

public class RotateAndShiftTriangles extends JPanel{

int rWidth, rHeight, centerX, centerY, prevMove = -1, maxX, maxY;
float pixelSize;
double radians;
static Point2D pA, pB, pC;

//Default constructor
RotateAndShiftTriangles(){
    rWidth = Integer.parseInt(JOptionPane.showInputDialog("Enter the rWidth of the panel: "));
    rHeight = Integer.parseInt(JOptionPane.showInputDialog("Enter the rHeight of the panel: "));
}

// main method of the program that all it really does is call the create method
public static void main(String [] argv){
    RotateAndShiftTriangles tri = new RotateAndShiftTriangles();
    tri.create();
}

public void create(){
    // Initializing graphics 
    JFrame win = new JFrame();
    Dimension d = new Dimension(800, 600);
    maxX = d.width - 1;
    maxY = d.height - 1;
    pixelSize = Math.max(rWidth/maxX, rHeight/maxY);
    centerX = maxX/2; centerY = maxY/2;
    win.setSize(d);
    win.setMinimumSize(d);
    win.setPreferredSize(d);
    win.getContentPane().setLayout(new BorderLayout());
    Point2D centerPoint = new Point2D.Double(centerX, centerY);
    JPanel draw = new JPanel();
    JPanel buttonPanel = new JPanel();
    JButton shiftButton = new JButton("Shift");
    JButton rotateButton = new JButton("Rotate");
    JButton shiftandRotateButton = new JButton("Shift and Rotate");
    JButton resetButton = new JButton("Reset");
    JButton backButton = new JButton("Back");

    // setting layout
    win.add(this);
    win.add(draw, BorderLayout.CENTER);
    buttonPanel.add(shiftButton);
    buttonPanel.add(rotateButton);
    buttonPanel.add(shiftandRotateButton);
    buttonPanel.add(resetButton);
    buttonPanel.add(backButton);
    win.add(buttonPanel, BorderLayout.SOUTH);
    win.pack();
    win.setLocationRelativeTo(win.getParent());

    // makes window visible and sets the default closing operations
    win.setVisible(true);
    win.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}

// Page 19 mappings to take the logical coords and change them to ints.
int iX(float x){
    return Math.round(centerX + x/pixelSize);
    }
int iY(float y){
    return Math.round(centerY - y/pixelSize);
    }

// Standard paintComponent method 
protected void paintComponent(Graphics g){
    super.paintComponent(g);
    g.setColor(Color.blue);
    g.drawRect(0, 0, maxX, maxY);
    float side = 0.95F * pixelSize, sideHalf = 0.5F * side, 
        h = sideHalf * (float)Math.sqrt(3), xA, yA, xB, yB, xC, yC, xA1, yA1, xB1, yB1, xC1, yC1, p, q;
    q = 0.05F; 
    p = 1 - q; 
    xA = centerX - sideHalf; 
    yA = centerY - 0.5F * h;
    xB = centerX + sideHalf; 
    yB = yA;
    xC = centerX; 
    yC = centerY + 0.5F * h;
    pA.setLocation(xA, yA);
    pB.setLocation(xB, yB);
    pC.setLocation(xC, yC);

    for (int i=0; i<50; i++) 
    {  
        g.drawLine(iX(xA), iY(yA), iX(xB), iY(yB));
        g.drawLine(iX(xB), iY(yB), iX(xC), iY(yC));
        g.drawLine(iX(xC), iY(yC), iX(xA), iY(yA));
        xA1 = p * xA + q * xB; 
        yA1 = p * yA + q * yB; 
        xB1 = p * xB + q * xC; 
        yB1 = p * yB + q * yC;
        xC1 = p * xC + q * xA; 
        yC1 = p * yC + q * yA; 
        xA = xA1; xB = xB1; xC = xC1;
        yA = yA1; yB = yB1; yC = yC1;
     } 
}

}

【问题讨论】:

    标签: java jpanel paintcomponent graphics2d


    【解决方案1】:
    win.add(this);
    win.add(draw, BorderLayout.CENTER);
    

    您将三角形面板添加到窗口中。当您不指定约束时,它将默认为 BorderLayout.CENTER。

    然后添加“draw”组件,它会替换您的面板,因为只能将一个组件添加到“CENTER”。

    尝试将您的三角形面板添加到BorderLayout.NORTH。但是,当您这样做时,您还需要覆盖三角形面板的 getPreferredSize() 方法,否则首选大小将是 (0, 0) 并且没有可绘制的内容。

    阅读 Custom Painting 上的 Swing 教程部分,了解更多信息和执行此操作的示例。

    编辑:

    再次查看您的代码,我什至不确定您为什么要创建“绘图”面板。您不向其中添加任何组件。所以只要去掉“draw”面板,让你的“triangle”面板显示在 BordeLayout.CENTER 中,但你仍然需要实现 getPreferredSize() 方法,否则 pack() 方法将忽略“triangle”面板。

    【讨论】:

    • 嗯,当我取出 win.add(this) 时,它并没有改变任何东西。但是当我取出另一行时,我得到一堆或空指针异常。我们需要在添加到 JFrame 的 Jpanel 上进行绘图。抱歉,如果我应该在最初的问题中说明这一点。
    • @jnics23,当然它不会改变任何东西。如果您不将组件添加到框架,则不会显示任何内容。但是,这不是我的建议。
    猜你喜欢
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多