1

テキストを入力してボタンを押すと、円グラフが表示されないのはなぜですか?

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.*;
import javax.swing.border.TitledBorder;

public class PieChart extends JFrame {

    private JTextField jtfParticipation = new JTextField();
    private JTextField jtfProjects = new JTextField();
    private JTextField jtfQuizzes = new JTextField();
    private JTextField jtfFinalExam = new JTextField();
    private JButton jbtCreatePieChart = new JButton("Create Pie Chart");

    public PieChart() {

        // Text panel

        JPanel panel1 = new JPanel(new GridLayout(8, 0));

        panel1.setBorder(new TitledBorder("Input percentages:"));



        // A font to change from the default Plain font to Arial font

        Font arialFont = new Font("Arial", Font.PLAIN, 12);

        JLabel jlblParticipation = new JLabel("Participation %");

        JLabel jlblProjects = new JLabel("Projects %");

        JLabel jlblQuizzes = new JLabel("Quizzes %");

        JLabel jlblFinalExam = new JLabel("Final Exam %");



        // The labels use the new font

        jlblParticipation.setFont(arialFont);

        jlblProjects.setFont(arialFont);

        jlblQuizzes.setFont(arialFont);

        jlblFinalExam.setFont(arialFont);



        // Adds the objects to the panel

        panel1.add(jlblParticipation);

        panel1.add(jtfParticipation);

        panel1.add(jlblProjects);

        panel1.add(jtfProjects);

        panel1.add(jlblQuizzes);

        panel1.add(jtfQuizzes);

        panel1.add(jlblFinalExam);

        panel1.add(jtfFinalExam);



        // Assigns the text panel and the button to one panel

        JPanel panel2 = new JPanel(new BorderLayout());

        panel2.add(panel1, BorderLayout.CENTER);

        panel2.add(jbtCreatePieChart, BorderLayout.SOUTH);


        add(panel2, BorderLayout.WEST);



        jbtCreatePieChart.addActionListener(new ButtonListener());

    }



    class ButtonListener implements ActionListener {



        @Override

        public void actionPerformed(ActionEvent e) {



            // Set the size and trigger a repaint

            final PieChartGraphic pie = new PieChartGraphic();

            add(pie, BorderLayout.CENTER);

            pie.setPreferredSize(new Dimension());

            pie.repaint();

        }

    }



    class PieChartGraphic extends JPanel {



        @Override
        protected void paintComponent(Graphics slice) {



            super.paintComponent(slice);



            int xCenter = getWidth() / 2;

            int yCenter = getHeight() / 2;

            int radius = (int) (Math.min(getWidth(), getHeight()) * 0.4);

            int x = xCenter - radius;
            int y = yCenter - radius;



            double inputIsDouble;

            int inputIsInt;

            int availablePercentage = 100;

            int currentAngle = 0;



            ArrayList<JTextField> jtfs = new ArrayList<>();

            jtfs.add(jtfProjects);

            jtfs.add(jtfParticipation);

            jtfs.add(jtfQuizzes);

            jtfs.add(jtfFinalExam);



            ArrayList<Color> color = new ArrayList<>();

            color.add(Color.RED);

            color.add(Color.GREEN);

            color.add(Color.BLUE);

            color.add(Color.WHITE);



            for (int i = 0; i < jtfs.size(); i++) {

                inputIsDouble = userInput(jtfs.get(i).getText(), availablePercentage);

                inputIsInt = (int) (inputIsDouble * 3.6);

                // Sets the color of the filled

                slice.setColor(color.get(i));

                // Sets the start point and size of the angle

                slice.fillArc(x, y, 2 * radius, 2 * radius, currentAngle, inputIsInt);

                currentAngle += inputIsInt;

                availablePercentage -= inputIsDouble;

            }



            // Places the text strings

            slice.setColor(Color.BLACK);

            slice.drawString("Participation - " +

                "\jtfParticipation.getText() + "%", 1 / 4 * x, 1 / 4 * y);

            slice.drawString("Projects - " + jtfProjects.getText() + "%", 3 / 4 * x, 1 / 4 * y);

            slice.drawString("Quizzes -- " + jtfQuizzes.getText() + "%", 1 / 4 * x, 3 / 4 * y);

            slice.drawString("Final - " + jtfFinalExam.getText() + "%", 3 / 4 * x, 3 / 4 * y);

        }

    }



    public static double userInput(String inputIsString, int availablePercentage) {

        return new Double(inputIsString).doubleValue();

    }



    public static void main(String[] args) {

        PieChart frame = new PieChart();

        frame.setTitle("CMIS Pie Chart");

        frame.setSize(334, 215);

        frame.setLocationRelativeTo(null);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setResizable(false);

        frame.setVisible(true);


    }

}
4

2 に答える 2

0

ここにはいくつかの問題があると思います。

まず、@Reimeus が指摘したサイズ/再描画の問題です。円グラフのサイズを設定してから、再描画する必要があります。

次に、ボタンをクリックするたびに新しい PieChartPanel を追加する方法は、奇妙に思えます。ユーザーがボタンを押すたびに、互いの上に積み重ねられる新しいパネルを作成することになります。円グラフ パネルを永続的に追加して、状態に応じて表示内容を更新しないのはなぜですか?

次のコードを変更しました。最初に、アクション リスナーを変更して余分なパネルを削除し、パネルのサイズを設定しました。再描画も追加しましたが、それは問題ではないようです:

class ButtonListener implements ActionListener {
  @Override
  public void actionPerformed(ActionEvent e) {
      // Set the size and trigger a repaint
      final PieChartGraphic pie = new PieChartGraphic();
      add(pie, BorderLayout.EAST);
      pie.setPreferredSize( new Dimension( 300, 300 ) );
      pie.repaint();
  }
}

次に、paintComponent メソッドを単純化して、すべてのコードを削除しました。

    protected void paintComponent(Graphics slice) {
        super.paintComponent(slice);

        slice.setColor( Color.RED );
        slice.fillRect( 0, 0, getWidth(), getHeight() );
    }

最後に、JFrame をサイズ変更可能に変更しました。これは、テスト中に再描画をトリガーする簡単な方法です。これらの変更により、ボタンをクリックしても何も表示されませんが、ウィンドウのサイズを変更すると赤いボックスが表示されます。

于 2012-07-18T22:31:31.553 に答える
0

考慮すべき点がいくつかあります。

panel3 を作成した後、コンポーネントのサイズは設定されません。

panel3.setSize(200, 200);
PieChartGraphic pieChartGraphic = new PieChartGraphic();
pieChartGraphic.setSize(200, 200);
panel3.add(pieChartGraphic);

jpanel3 を追加した後、呼び出す必要があります

jpanel3.repaint();

追加されたコンポーネントのグラフィックスをペイントします。

paintComponent 呼び出しの途中で、ユーザー入力と検証が行われます。これは、塗装などを行う直前に行う必要があります。

私が使用した:

public static double userInput(String inputIsString, int availablePercentage) {
    return new Double(inputIsString).doubleValue();
}

パイチャートを見ることができます。

于 2012-07-18T21:16:26.137 に答える