1

ユーザーが drawPanel JPanel をクリックして楕円を表示すると、楕円を描画するだけの簡単なプログラム (ほとんどは別の用途に使用されます) があります。問題は、repaint() メソッドが paintComponent() を呼び出していないことです。どうしてこれなの?

コードは次のとおりです。

// Imports Used:
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import javax.swing.*;
import java.awt.geom.*;
// Class DrawPolygon
public class DrawPolygon extends JPanel implements MouseListener
{
// Variables used in GUI
static JFrame frame;
static JPanel drawPanel;
static JPanel labelPanel;
static JPanel primaryPanel;
static JButton loadButton;
static JButton saveButton;
static JButton clearButton;
static JButton addButton;
static JButton moveButton;
static JButton exitButton;
// Variables used for GUI interaction
static final int SIZE = 6;
static int numVertices;
ArrayList<Point> vertices;
static Color outlineColor = Color.RED;
static int lineWidth = 10;
static Color fillColor = Color.BLACK;
// Constructor for new Polygon Drawing Application
public DrawPolygon()
{
    // Create Frame
    frame = new JFrame("Vector Painter");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    // Set Location of GUI on screen
    frame.setLocation(225,100);
    // Primary Panel to store Draw Panel and Lable/Button Panel
    primaryPanel = new JPanel();
    // Create Label Panel
    createLabelPanel();
    // Create Draw Panel
    createDrawPanel();
    // Add panels to Primary
    primaryPanel.add(labelPanel);
    primaryPanel.add(drawPanel);
    // Add to frame
    frame.getContentPane().add(primaryPanel);
    frame.pack();
    frame.setVisible(true);
}
// Add Buttons to left side
public void createLabelPanel()
{
    // Label Panel to add Buttons
    labelPanel = new JPanel();
    labelPanel.setBackground(Color.BLACK);
    labelPanel.setPreferredSize(new Dimension(200,600));
    // Create JButtons
    loadButton = new JButton("LOAD");
    loadButton.setPreferredSize(new Dimension(180,75));
    loadButton.setBackground(Color.BLACK);
    loadButton.setForeground(Color.WHITE);
    loadButton.addMouseListener(this);
    saveButton = new JButton("SAVE");
    saveButton.setPreferredSize(new Dimension(180,75));
    saveButton.setBackground(Color.BLACK);
    saveButton.setForeground(Color.WHITE);
    saveButton.addMouseListener(this);
    clearButton = new JButton("CLEAR");
    clearButton.setPreferredSize(new Dimension(180,75));
    clearButton.setBackground(Color.BLACK);
    clearButton.setForeground(Color.WHITE);
    clearButton.addMouseListener(this);
    addButton = new JButton("ADD");
    addButton.setPreferredSize(new Dimension(180,75));
    addButton.setBackground(Color.BLACK);
    addButton.setForeground(Color.WHITE);
    addButton.addMouseListener(this);
    moveButton = new JButton("MOVE");
    moveButton.setPreferredSize(new Dimension(180,75));
    moveButton.setBackground(Color.BLACK);
    moveButton.setForeground(Color.WHITE);
    moveButton.addMouseListener(this);
    exitButton = new JButton("EXIT");
    exitButton.setPreferredSize(new Dimension(180,75));
    exitButton.setBackground(Color.BLACK);
    exitButton.setForeground(Color.WHITE);
    exitButton.addMouseListener(this);
    // Add Buttons to Label Panel
    labelPanel.add(loadButton);
    labelPanel.add(saveButton);
    labelPanel.add(clearButton);
    labelPanel.add(addButton);
    labelPanel.add(moveButton);
    labelPanel.add(exitButton);
}
// Creates Draw Panel
public void createDrawPanel()
{
    // Draw Panel to Draw Polygons
    drawPanel = new JPanel();
    drawPanel.setBackground(Color.BLACK);
    drawPanel.setPreferredSize(new Dimension(600,600));
    drawPanel.addMouseListener(this);
    vertices = new ArrayList<>();
}

@Override
public void paintComponent(Graphics g)
{
    super.paintComponent(g);

    g.setColor(Color.ORANGE);

    for (Point spot : vertices)
    {
        g.fillOval(spot.x-SIZE, spot.y-SIZE, SIZE*2, SIZE*2);
    }

    g.drawString("Count: " + vertices.size(), 5, 15);

    System.out.println("repaint is working?");
}

// Execute when Load button is clicked
public void loadButton()
{
    System.out.println("Load Button CLICKED!!");
}
// Execute when Save button is clicked
public void saveButton()
{
    System.out.println("Save Button CLICKED!!");
}
// Execute when Clear button is clicked
public void clearButton()
{
    System.out.println("Clear Button CLICKED!!");
}
// Execute when Add button is clicked
public void addButton()
{
    System.out.println("Add Button CLICKED!!");
}
// Execute when Move button is clicked
public void moveButton()
{
    System.out.println("Move Button CLICKED!!");
}
public void mouseClicked(MouseEvent e)
{
    if (e.getSource() == loadButton)
    {
        loadButton();
    }
    else if (e.getSource() == saveButton)
    {
        saveButton();
    }
    else if (e.getSource() == clearButton)
    {
        clearButton();
    }
    else if (e.getSource() == addButton)
    {
        addButton();
    }
    else if (e.getSource() == moveButton)
    {
        moveButton();
    }
    else if (e.getSource() == exitButton)
    {
        System.exit(0);
    }
    else if (e.getSource() == drawPanel)
    {
        System.out.println("TEST");
        vertices.add(e.getPoint());
        repaint();
    }
}
// These are here because program wouldn't compile without them
public void mousePressed(MouseEvent e){}
public void mouseReleased(MouseEvent e){}
public void mouseExited(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
// Main Function
public static void main(String[] args) 
{
    // Create Frame
    new DrawPolygon();        
}
}
4

1 に答える 1

4

実際には repaint が呼び出されていますが、現在の DrawPolygon オブジェクトでは、これらのいずれかを表示していないように見えるため、paintComponent(...)呼び出されることはありません。明確にするために、現在のクラス DrawPolygon は JPanel を拡張していますが、GUI 階層の一部であるコンテナーには追加されていないようです。thisおそらく、現在のオブジェクトである を GUI のどこかに追加したいですか? 実際、現在のオブジェクトを drawPanel JPanel オブジェクトの代わりに使用することを検討する必要があります。その変数を完全に削除することを検討します。

また、問題とは関係ありませんが、代わりに ActionListeners を使用する必要がある JButton で MouseListeners を使用することはほとんどありません。

于 2012-10-21T15:12:40.857 に答える