2

Java プログラム (swing を使用) のパネル/キャンバス/ウィンドウに描画するグラフィックス/テキストを取得できません。

私はそれを2つのクラスに分割しようとさえしました.1つはペイントコンポーネント(JPanelを拡張)で、他のものは別のクラス(JFrameを拡張)です。

Canvas のあるパネルと Canvas のないパネルを試しました (どちらも同じ結果)。

青い領域には何も描画できません。私の記憶が正しければ、パネルをまったく使用しないで試してみたところ、グラフィックが表示されました。私はこのプログラムをテキスト(ウィンドウなし)で、さらにはAndroidアプリ(Androidアプリは難しいと思っていましたが、これに比べて簡単でした)でうまく実行しました。

JLabel を使用して、必要なテキスト、またはおそらく editbox/edittext (swing に相当するものが何であれ) を実行できることはわかっていますが、私はグラフィック指向の人なので、Java でグラフィックを実行する方法を知りたいです (今後のプロジェクト)。

これが私のコードです(私はJavaで4日間しかコーディングしていないので、スタイルの悪さなどを許してください。ところで、いくつかの変数をグローバル風に変更し、それを機能させようとして公開したので、それも許してください: -) また、ボタンやメニューなどを作成するための手順は元々別々でしたが、それが問題になる場合に備えて、後ですべてを 1 つの手順にまとめましたので、それもご容赦ください。)

import java.util.Random;
import java.util.Date;
import java.io.*;
import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;

public class cookiewin extends JPanel
{

    static int randc = 1;
    static JButton b1, b2;
    JMenuBar menubar = null;
    static JFrame win = null;
    static JPanel panel = null, drawa = null;
    static Graphics2D g2n = null;
//static Graphics g2=null;

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setColor(Color.BLACK);
        g2.drawString("This is a test", 20, 100);
        g2.drawLine(10, 10, 290, 290);
    }

    protected static ImageIcon createImageIcon(String path) {
        java.net.URL URL = TestPaint.class.getResource(path);
        if (URL != null) {
            return (new ImageIcon(URL));
        } else {
            System.err.println("Can't open '" + path + "'\n");
            return (null);
        }
    }

    public TestPaint() {
        Graphics g3;
        Container con;
        win = new JFrame("Fortune Cookie");
        win.setSize(640, 480);
        win.setLocation(100, 100);
        win.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        win.setDefaultLookAndFeelDecorated(true);
        menubar = new JMenuBar();
        JMenu menu = new JMenu("Options");
        menubar.add(menu);
        JMenuItem menuitem = new JMenuItem("Quit");
        menuitem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                System.out.println("Menuitem1\n");
                win.dispose();
            }
        });
        menu.add(menuitem);
        menu.addSeparator();
        JMenuItem menuitem2 = new JMenuItem("About");
        menuitem2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                System.out.println("Menuitem2\n");
            }
        });
        menu.add(menuitem2);
        win.setJMenuBar(menubar);
        panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
        Color backcol = new Color(90, 0, 0);
        panel.setBackground(backcol);
        con = win.getContentPane();
        con.add(panel, BorderLayout.EAST);
        drawa = new JPanel();
        drawa.setPreferredSize(new Dimension(462, 0));
        drawa.setBorder(BorderFactory.createLineBorder(Color.yellow, 2));
        drawa.setBackground(Color.blue);
        win.setBackground(Color.magenta);
        JPanel panel2 = new JPanel();
        panel2.setBackground(backcol);
        panel2.setPreferredSize(new Dimension(400, 80));
        panel2.setLayout(new BoxLayout(panel2, BoxLayout.Y_AXIS));
        try {
            InputStream is = new FileInputStream("deng_th_.ttf");
            Font font = Font.createFont(Font.TRUETYPE_FONT, is);
            Color textcol = new Color(255, 255, 0);
            JLabel nulltext = new JLabel("    ");
            nulltext.setFont(font.deriveFont(38f));
            panel2.add(nulltext);
            JLabel titletext = new JLabel("        Fortune Cookie:");
            titletext.setFont(font.deriveFont(24f));
            titletext.setForeground(textcol);
            panel2.add(titletext);
        } catch (IOException ex) {
            System.out.println("Font File Error:");
        } catch (FontFormatException ex) {
            System.out.println("Font Error:");
        }
        con.add(panel2, BorderLayout.NORTH);
        JPanel panel3 = new JPanel();
        panel3.setBackground(backcol);
        panel3.setPreferredSize(new Dimension(400, 10));
        con.add(panel3, BorderLayout.SOUTH);
        JPanel panel4 = new JPanel();
        panel4.setBackground(backcol);
        panel4.setPreferredSize(new Dimension(10, 400));
        con.add(panel4, BorderLayout.WEST);
        b1 = new JButton("Another");
        b1.setToolTipText("Get another fortune cookie");
        b1.setPreferredSize(new Dimension(150, 48));
        b1.setMinimumSize(new Dimension(150, 48));
        b1.setMaximumSize(new Dimension(150, 48));
        b1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                System.out.println("Button1\n");
            }
        });
        ImageIcon b2i = createImageIcon("rand.jpg");
        b2 = new JButton("Non-Random", b2i);
        b2.setToolTipText("Toggle random selection");
        b2.setPreferredSize(new Dimension(150, 48));
        b2.setMinimumSize(new Dimension(150, 48));
        b2.setMaximumSize(new Dimension(150, 48));
        b2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                System.out.println("Button2\n");
                randc = 1 - randc;
                if (randc == 0) {
                    b2.setText("Random");
                } else {
                    b2.setText("Non-Random");
                }
            }
        });
        panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        panel.add(b1);
        panel.add(Box.createRigidArea(new Dimension(0, 10)));
        panel.add(b2);
        Canvas can = new Canvas();
        Color cancol = new Color(220, 220, 220);
        can.setBackground(cancol);
        drawa.add(can);
        con.add(drawa, BorderLayout.CENTER);
        win.setIconImage(new ImageIcon("rand.png").getImage());
        win.setVisible(true);
    }

    public static void main(String[] args) {
        int i, numcook = 0, x, y;
        int[] cookiepos = new int[500];
        Random ranGen2 = new Random();
        long seed;
        File fp = new File("cookie.idx");

        new TestPaint();

    }

}
4

1 に答える 1

5

基本的に、カスタム ペイントを使用してコンポーネントを完全に無視しています。パネルを追加せずにこの UI を構築します。

これは、paintComponentメソッドが呼び出されないことを意味します。

ペインからすべての UI 作成コードを取り出し、別のcookiewin場所に配置してから、パネルをどこかに追加しcookiewinます ...

そして例を挙げて

public class TestPaint {

    protected static ImageIcon createImageIcon(String path) {
        java.net.URL URL = TestPaint.class.getResource(path);
        if (URL != null) {
            return (new ImageIcon(URL));
        } else {
            System.err.println("Can't open '" + path + "'\n");
            return (null);
        }
    }
    private JFrame win;
    private JMenuBar menubar;
    private JPanel panel;
    private Container con;
    private JPanel drawa;
    private JButton b1;
    private JButton b2;

    public TestPaint() {

        win = new JFrame("Fortune Cookie");
        win.setSize(640, 480);
        win.setLocation(100, 100);
        win.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        win.setDefaultLookAndFeelDecorated(true);

        menubar = new JMenuBar();
        JMenu menu = new JMenu("Options");
        menubar.add(menu);
        JMenuItem menuitem = new JMenuItem("Quit");
        menuitem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                System.out.println("Menuitem1\n");
                win.dispose();
            }
        });
        menu.add(menuitem);
        menu.addSeparator();
        JMenuItem menuitem2 = new JMenuItem("About");
        menuitem2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                System.out.println("Menuitem2\n");
            }
        });
        menu.add(menuitem2);
        win.setJMenuBar(menubar);
        panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
        Color backcol = new Color(90, 0, 0);
        panel.setBackground(backcol);
        con = win.getContentPane();
        con.add(panel, BorderLayout.EAST);
        drawa = new JPanel();
        drawa.setPreferredSize(new Dimension(462, 0));
        drawa.setBorder(BorderFactory.createLineBorder(Color.yellow, 2));
        drawa.setBackground(Color.blue);
        win.setBackground(Color.magenta);
        JPanel panel2 = new JPanel();
        panel2.setBackground(backcol);
        panel2.setPreferredSize(new Dimension(400, 80));
        panel2.setLayout(new BoxLayout(panel2, BoxLayout.Y_AXIS));
        try {
            InputStream is = new FileInputStream("deng_th_.ttf");
            Font font = Font.createFont(Font.TRUETYPE_FONT, is);
            Color textcol = new Color(255, 255, 0);
            JLabel nulltext = new JLabel("    ");
            nulltext.setFont(font.deriveFont(38f));
            panel2.add(nulltext);
            JLabel titletext = new JLabel("        Fortune Cookie:");
            titletext.setFont(font.deriveFont(24f));
            titletext.setForeground(textcol);
            panel2.add(titletext);
        } catch (IOException ex) {
            System.out.println("Font File Error:");
        } catch (FontFormatException ex) {
            System.out.println("Font Error:");
        }
        con.add(panel2, BorderLayout.NORTH);
        JPanel panel3 = new JPanel();
        panel3.setBackground(backcol);
        panel3.setPreferredSize(new Dimension(400, 10));
        con.add(panel3, BorderLayout.SOUTH);
        JPanel panel4 = new JPanel();
        panel4.setBackground(backcol);
        panel4.setPreferredSize(new Dimension(10, 400));
        con.add(panel4, BorderLayout.WEST);
        b1 = new JButton("Another");
        b1.setToolTipText("Get another fortune cookie");
        b1.setPreferredSize(new Dimension(150, 48));
        b1.setMinimumSize(new Dimension(150, 48));
        b1.setMaximumSize(new Dimension(150, 48));
        b1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                System.out.println("Button1\n");
            }
        });
        ImageIcon b2i = createImageIcon("rand.jpg");
        b2 = new JButton("Non-Random", b2i);
        b2.setToolTipText("Toggle random selection");
        b2.setPreferredSize(new Dimension(150, 48));
        b2.setMinimumSize(new Dimension(150, 48));
        b2.setMaximumSize(new Dimension(150, 48));
        b2.addActionListener(new ActionListener() {
            private int randc;
            public void actionPerformed(ActionEvent evt) {
                System.out.println("Button2\n");
                randc = 1 - randc;
                if (randc == 0) {
                    b2.setText("Random");
                } else {
                    b2.setText("Non-Random");
                }
            }
        });
        panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        panel.add(b1);
        panel.add(Box.createRigidArea(new Dimension(0, 10)));
        panel.add(b2);
//        Canvas can = new Canvas();
        Color cancol = new Color(220, 220, 220);
//        can.setBackground(cancol);
//        drawa.add(can);
        con.add(drawa, BorderLayout.CENTER);
        con.add(new CustomPaint(), BorderLayout.NORTH);
        win.setIconImage(new ImageIcon("rand.png").getImage());
        win.setVisible(true);
    }

    public static void main(String[] args) {
        int i, numcook = 0, x, y;
        int[] cookiepos = new int[500];
        Random ranGen2 = new Random();
        long seed;
        File fp = new File("cookie.idx");

        new TestPaint();

    }

    public class CustomPaint extends JPanel {

        @Override
        public Dimension getPreferredSize() {

            return new Dimension(100, 100);

        }

        @Override
        public Dimension getMinimumSize() {
            return getPreferredSize();
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g;
            g2.setColor(Color.BLUE);
            g2.fillRect(0, 0, getWidth(), getHeight());
            g2.setColor(Color.WHITE);

            FontMetrics fontMetrics = g2.getFontMetrics();

            g2.drawString("This is a test", 20, fontMetrics.getAscent());
            g2.drawLine(10, 10, 290, 290);
        }
    }
}
于 2012-08-09T07:37:23.180 に答える