Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

Javaアプリケーションでpaint()が呼ばれません。

java Graphics の描画で、以下のように
記述しているのですが、ウィンドウサイズを変更
したり最大化してもpaintメソッドが呼び出されなく
強制的にwindowActivatedで描画しても描画がされません
その時、一瞬表示されるのですがまた消えてしまいます。
repaint()をすると同じく描画が消えてしまいます。
ご教授、宜しくお願いいたします。

public class Frame1 extends JFrame{
    
        ....
        
    private JFrame getJFrame() {
        if (jFrame == null) {
            jFrame = new JFrame();
            jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jFrame.setMinimumSize(new Dimension(1280, 1024));
            jFrame.setMaximumSize(new Dimension(1280, 1024));
            jFrame.setResizable(true);
            jFrame.setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getResource("main.PNG")));
            jFrame.setJMenuBar(getJJMenuBar());
            jFrame.setSize(1280, 1000);
            jFrame.setContentPane(getJContentPane());
            jFrame.setTitle("test");
            jFrame.setVisible(false);
            jFrame.addWindowListener(new java.awt.event.WindowAdapter() {
                public void windowActivated(java.awt.event.WindowEvent e) {
                    //draw(jTextField14.getText(),1);
                }
            });
        }
        return jFrame;
    }
    private JPanel getJPanel2() {
        if (jPanel2 == null) {
            jPanel2 = new JPanel();
            jPanel2.setLayout(null);
            jPanel2.setBounds(new Rectangle(0, 0, 1025, 880));
            jPanel2.setBackground(Color.black);
            jPanel2.add(jLabel19, null);
        }
        return jPanel2;
    }
        
    public void draw(String s, int i) {
        Graphics g = jPanel2.getGraphics();
        if (i == 0) {
            g.setColor(Color.black);
            g.fillRect(-1500, -1500, 3000, 3000);
        }
        if (s.length() > 0) {
            try {
                l = Integer.parseInt(s);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        if (l >= 0) {
            //Dxfdraw ddraw = new Dxfdraw(g, l);
            Canvas ddraw = new Dxfdraw(g, l);
            jPanel2.add(ddraw);
        } else {
            //Dxfdraw ddraw = new Dxfdraw(g, l);
            Canvas ddraw = new Dxfdraw(g);
            jPanel2.add(ddraw);
        }
    }
    public void paint(Graphics g){
        draw(jTextField14.getText(), 1);
        System.out.println("paint()");
    }
    
    public void update(Graphics g)
    {
        draw(jTextField14.getText(), 1);
        System.out.println("update()");
    }
}

public class Dxfdraw extends Canvas {

    public Dxfdraw(Graphics g) {
        dpaint(g); // 描画
    }

    public Dxfdraw(Graphics g, int i) {
        dpaint(g, i); // レイヤー指定描画
    }
    
    ....
    
    public void paint(Graphics g) {
        System.out.println("paint2()");
    }
    public void update(Graphics g) {
        System.out.println("update2()");
    }
}


10

回答

81589

閲覧

10件の回答

評価

0

実験して欲しいのなら、動作可能なミニマムコードを記述してください。
これでは、動作させるためにいろいろ手を加えねばなりません。
込み入ったコードでは、不具合の原因がぱっと見て分かるとは限りません。

評価

0

まぁぱっと見た感じで……。

Frameのpaint、updateをOverrideしているのが
悪いかな、と。

updateはpaintを呼びだすので……というか、paintメソッドがダイレクトに呼ばれるのはupdateの中だけですから、
updateがpaintを呼ばないと、paintは呼ばれません。

また、paintを安易にOverrideすると通常描画されるはずの描画がされなくなります。
paintはそのComponentの全描画を行うので、
Overrideする際はそれを自前で記述しなければいけません。

掲示されているソースはそれを行っていないので、何も表示されないと推察できます。
(BlackBoxメソッドが多くて動かなさそうですから推察どまり)

super.update、super.paintをそれぞれに追加してください。
paint、update周りはAPIのソースを見て動作を把握して置かないと絶対に望む動作にはなりません。
安易に書き換えないほうが、無難です。

評価

0

mio様
ご返答有難うございます。
下記、test2.java、Gdraw.javaになります。
Eclipse + VisualEditor で作成しています
宜しくお願いいたします。

すったか様
ご返答有難うございます。
描画は出来まして、ウィンドウサイズ
を変更すると描画が消えてしまいます。
宜しくお願いいたします。

--test2.java--
package t;

import java.awt.event.KeyEvent;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Canvas;
import java.awt.Event;
import java.awt.BorderLayout;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.KeyStroke;
import java.awt.Point;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JMenuItem;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JFrame;
import javax.swing.JDialog;
import java.awt.GridBagLayout;

public class Test2 {

    private JFrame jFrame = null;

    private JPanel jContentPane = null;

    private JMenuBar jJMenuBar = null;

    private JMenu fileMenu = null;

    private JMenu editMenu = null;

    private JMenu helpMenu = null;

    private JMenuItem exitMenuItem = null;

    private JMenuItem aboutMenuItem = null;

    private JMenuItem cutMenuItem = null;

    private JMenuItem copyMenuItem = null;

    private JMenuItem pasteMenuItem = null;

    private JMenuItem saveMenuItem = null;

    private JDialog aboutDialog = null;

    private JPanel aboutContentPane = null;

    private JLabel aboutVersionLabel = null;

    private JPanel jPanel = null;

    /**
     * This method initializes jPanel    
     *     
     * @return javax.swing.JPanel    
     */
    private JPanel getJPanel() {
        if (jPanel == null) {
            jPanel = new JPanel();
            jPanel.setLayout(new GridBagLayout());
        }
        return jPanel;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO 自動生成されたメソッド・スタブ
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                Test2 application = new Test2();
                application.getJFrame().setVisible(true);
            }
        });
    }

    /**
     * This method initializes jFrame
     * 
     * @return javax.swing.JFrame
     */
    private JFrame getJFrame() {
        if (jFrame == null) {
            jFrame = new JFrame();
            jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jFrame.setJMenuBar(getJJMenuBar());
            jFrame.setSize(300, 200);
            jFrame.setContentPane(getJContentPane());
            jFrame.setTitle("Application");
        }
        return jFrame;
    }

    /**
     * This method initializes jContentPane
     * 
     * @return javax.swing.JPanel
     */
    private JPanel getJContentPane() {
        if (jContentPane == null) {
            jContentPane = new JPanel();
            jContentPane.setLayout(new BorderLayout());
            jContentPane.add(getJPanel(), BorderLayout.CENTER);
        }
        return jContentPane;
    }

    /**
     * This method initializes jJMenuBar    
     *     
     * @return javax.swing.JMenuBar    
     */
    private JMenuBar getJJMenuBar() {
        if (jJMenuBar == null) {
            jJMenuBar = new JMenuBar();
            jJMenuBar.add(getFileMenu());
            jJMenuBar.add(getEditMenu());
            jJMenuBar.add(getHelpMenu());
        }
        return jJMenuBar;
    }

    /**
     * This method initializes jMenu    
     *     
     * @return javax.swing.JMenu    
     */
    private JMenu getFileMenu() {
        if (fileMenu == null) {
            fileMenu = new JMenu();
            fileMenu.setText("File");
            fileMenu.add(getSaveMenuItem());
            fileMenu.add(getExitMenuItem());
        }
        return fileMenu;
    }

    /**
     * This method initializes jMenu    
     *     
     * @return javax.swing.JMenu    
     */
    private JMenu getEditMenu() {
        if (editMenu == null) {
            editMenu = new JMenu();
            editMenu.setText("Edit");
            editMenu.add(getCutMenuItem());
            editMenu.add(getCopyMenuItem());
            editMenu.add(getPasteMenuItem());
        }
        return editMenu;
    }

    /**
     * This method initializes jMenu    
     *     
     * @return javax.swing.JMenu    
     */
    private JMenu getHelpMenu() {
        if (helpMenu == null) {
            helpMenu = new JMenu();
            helpMenu.setText("Help");
            helpMenu.add(getAboutMenuItem());
        }
        return helpMenu;
    }

    /**
     * This method initializes jMenuItem    
     *     
     * @return javax.swing.JMenuItem    
     */
    private JMenuItem getExitMenuItem() {
        if (exitMenuItem == null) {
            exitMenuItem = new JMenuItem();
            exitMenuItem.setText("Exit");
            exitMenuItem.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    System.exit(0);
                }
            });
        }
        return exitMenuItem;
    }

    /**
     * This method initializes jMenuItem    
     *     
     * @return javax.swing.JMenuItem    
     */
    private JMenuItem getAboutMenuItem() {
        if (aboutMenuItem == null) {
            aboutMenuItem = new JMenuItem();
            aboutMenuItem.setText("About");
            aboutMenuItem.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    JDialog aboutDialog = getAboutDialog();
                    aboutDialog.pack();
                    Point loc = getJFrame().getLocation();
                    loc.translate(20, 20);
                    aboutDialog.setLocation(loc);
                    aboutDialog.setVisible(true);
                }
            });
        }
        return aboutMenuItem;
    }

    /**
     * This method initializes aboutDialog    
     *     
     * @return javax.swing.JDialog
     */
    private JDialog getAboutDialog() {
        if (aboutDialog == null) {
            aboutDialog = new JDialog(getJFrame(), true);
            aboutDialog.setTitle("About");
            aboutDialog.setContentPane(getAboutContentPane());
        }
        return aboutDialog;
    }

    /**
     * This method initializes aboutContentPane
     * 
     * @return javax.swing.JPanel
     */
    private JPanel getAboutContentPane() {
        if (aboutContentPane == null) {
            aboutContentPane = new JPanel();
            aboutContentPane.setLayout(new BorderLayout());
            aboutContentPane.add(getAboutVersionLabel(), BorderLayout.CENTER);
        }
        return aboutContentPane;
    }

    /**
     * This method initializes aboutVersionLabel    
     *     
     * @return javax.swing.JLabel    
     */
    private JLabel getAboutVersionLabel() {
        if (aboutVersionLabel == null) {
            aboutVersionLabel = new JLabel();
            aboutVersionLabel.setText("Version 1.0");
            aboutVersionLabel.setHorizontalAlignment(SwingConstants.CENTER);
        }
        return aboutVersionLabel;
    }

    /**
     * This method initializes jMenuItem    
     *     
     * @return javax.swing.JMenuItem    
     */
    private JMenuItem getCutMenuItem() {
        if (cutMenuItem == null) {
            cutMenuItem = new JMenuItem();
            cutMenuItem.setText("Cut");
            cutMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,
                    Event.CTRL_MASK, true));
        }
        return cutMenuItem;
    }

    /**
     * This method initializes jMenuItem    
     *     
     * @return javax.swing.JMenuItem    
     */
    private JMenuItem getCopyMenuItem() {
        if (copyMenuItem == null) {
            copyMenuItem = new JMenuItem();
            copyMenuItem.setText("Copy");
            copyMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,
                    Event.CTRL_MASK, true));
        }
        return copyMenuItem;
    }

    /**
     * This method initializes jMenuItem    
     *     
     * @return javax.swing.JMenuItem    
     */
    private JMenuItem getPasteMenuItem() {
        if (pasteMenuItem == null) {
            pasteMenuItem = new JMenuItem();
            pasteMenuItem.setText("Paste");
            pasteMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V,
                    Event.CTRL_MASK, true));
        }
        return pasteMenuItem;
    }

    /**
     * This method initializes jMenuItem    
     *     
     * @return javax.swing.JMenuItem    
     */
    private JMenuItem getSaveMenuItem() {
        if (saveMenuItem == null) {
            saveMenuItem = new JMenuItem();
            saveMenuItem.setText("Save");
            saveMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,
                    Event.CTRL_MASK, true));
            saveMenuItem.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent e) {
                    Canvas can = new Gdraw(jPanel.getGraphics());
                    jPanel.add(can);
                }
            });
        }
        return saveMenuItem;
    }

}

--END--
--Gdraw.java--
package t;

import java.awt.Canvas;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;

public class Gdraw extends Canvas {
    
    public Gdraw(Graphics g){
        paint(g);
    }
    
    public void paint(Graphics g){
        Graphics2D g2 =(Graphics2D)g;
        line(g2);
    }
    
    public void line(Graphics2D g){
        g.draw(new Line2D.Double(10.11,12.0,50.2,60.0));
    }
}

--END--

評価

0

>動作可能なミニマムコードを記述してください
の意味は分かりますか?

評価

0

そうですか。有難うございました。

評価

0

……最近、こういう質問多いですねぇ。
会話になっていない(^^;


プログラム目的はまったくわからないですが(saveで描画するって謎)
質問にお答えしときます。

他のLayoutは追加されたコンポネントの大きさを自動的に変更しますが、GridBagLayoutはaddする際は非常に細かい設定が必要で、かつ、初期サイズにあわせて大きさを決めます。

ので、Gdraw をaddする際にsizeが決まっていないのが原因です。
setSizeで大きさを決めましょう。
表示できます。

余談ですがGUIの描画系のデバッグ方法として有効なのはsetBackgroundです。
このメソッドで背景色を原色(RED,BLUEなど)にしてやると
GUIコンポネントが今どこにどれぐらいのサイズで表示されているか一目瞭然です。
addされたかされていないか、描画されたかされていないか、大きさが変更されているか、他のコンポーネントにかぶっていないか
など確認作業が楽になりますよ。

評価

0

すったか様

解決いたしました。有難うございました。
デバッグ方法もお教えいただきご感謝いたします。私、今日から快眠できそうです。
有難うございました。

(saveで描画は、テストするのに適当なボタンにいれましたからです。)

とし

評価

0

バカって会話にならないんだよね。

評価

0

ここまで来て煽るだけの人間って
どうなんでしょうか?

評価

0

ここまできて注意するだけの七誌って
どうなんでしょうか?

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。