2

私はフランス語なので英語はかなり下手ですが、Javaに本当に問題があります。いくつかのfillRect&coを使用して手動で作成したイメージを表示しようとしています。

できます。次に、テキストフィールドに入力したテキストの関数としてこの画像を更新します。そして問題があります:それは何も変更しません、そして私が手動でウィンドウを再スケーリングするJFrameと、画像は完全に変形したか、ひどくスケーリングされたように見えます。

私は初心者で、GUIに問題があります。さらに、GUIをImagesと結合したい場合も同様です。

手伝って頂けますか?なぜ私が望むように動作しないのですか?これは以下の私のコードです。少し長いですが、実際には非常に単純です。ありがとう :)


少し変更しました。これは2eバージョンです。

単純な長方形の色を変更するために条件を変更できないという問題があります。入力フィールドで「lol」を試してください。

コードバージョン2

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Color;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.ParseException;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.ImageIcon;

public class Fenetre extends JFrame {
    private JFrame frame;
    private JPanel container = new JPanel();
    private JTextField jtf;
    private JLabel label = new JLabel("Commandes   ");
    private JButton b = new JButton ("OK");
    private Graphics graph;
    private Image img;
    private JLabel screen;
    private boolean color;

    /**
     * Constructeur de l'objet 
     */
    public Fenetre(){
        color = true;


        frame = new JFrame();
        frame.setTitle("Animation");
        frame.setSize(1000, 400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);

        container.setBackground(Color.white);
        container.setLayout(new BorderLayout());


        JPanel top = new JPanel();

        jtf = new JTextField();

        jtf.setPreferredSize(new Dimension(800, 30));

        b.addActionListener(new BoutonListener());

        frame.setContentPane(top);
        frame.setVisible(true); 

        paintComponent(graph);

        screen = new JLabel( new ImageIcon(img));

        top.add(screen);
        top.add(label);
        top.add(jtf);
        top.add(b);

        frame.setContentPane(top);
     }      


    class BoutonListener implements ActionListener{ 
        public void actionPerformed(ActionEvent e) {
                if(jtf.getText().equals("lol")) lol();
                System.out.println("Entry  : " + jtf.getText());
        }  
    }

    public void paintComponent(Graphics g)
    {
        if(img == null) {
            img = frame.createImage(1000,300);
            g = img.getGraphics();
        }
        g.setColor(Color.white);
        g.fillRect(0,0,1000,300);
        if(color) g.setColor(Color.orange); else g.setColor(Color.blue);
        g.fillRect(8,25,200,100);
        g.setColor(Color.green);
        g.drawString("Text",10,10);
    }

    public void lol()
    {
        if(color) color = false; else color = true;
    }
}

前のコード

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Color;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.ParseException;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.ImageIcon;

public class Fenetre extends JFrame {

    private JPanel container = new JPanel();
    private JTextField jtf;
    private JLabel label = new JLabel("Commandes   ");
    private JButton b = new JButton ("OK");
    private Graphics g;
    private Image img;
    private JLabel screen;

    /**
     * Constructeur de l'objet 
     */
    public Fenetre(){

        this.setTitle("Animation");
        this.setSize(1000, 400);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);

        container.setBackground(Color.white);
        container.setLayout(new BorderLayout());


        JPanel top = new JPanel();

        jtf = new JTextField();

        jtf.setPreferredSize(new Dimension(800, 30));

        b.addActionListener(new BoutonListener());

        this.setContentPane(top);
        this.setVisible(true); 

        paint(g);

        screen = new JLabel( new ImageIcon(img));

        top.add(screen);
        top.add(label);
        top.add(jtf);
        top.add(b);


        this.setContentPane(top);
     }      


    class BoutonListener implements ActionListener{ 
        public void actionPerformed(ActionEvent e) {
                System.out.println("Entry  : " + jtf.getText());
                if(jtf.getText().equals("lol")) lol();
        }  
    }

    @Override
    public void paint(Graphics g)
    {
        if(img == null) {
            img = createImage(1000,300);
            g = img.getGraphics();
        }
        g.setColor(Color.white);
        g.fillRect(0,0,1000,300);
        g.setColor(Color.orange);
        g.fillRect(8,25,200,100);
        g.setColor(Color.green);
        g.drawString("Text",10,10);
    }

    @Override
    public void update(Graphics g)
    {
        g.setColor(Color.blue);
        g.fillRect(8,25,300,100);
    }

    public void lol()
    {
        g.setColor(Color.blue);
        g.fillRect(8,25,200,100);
    }
}
4

2 に答える 2

3

コードにいくつかの問題があります。

  1. gメンバー変数をメソッドのgパラメーターと混同しています。paintlol呼び出されるgnullNullPointerException
  2. 決してつかむべきではありませんGraphics(本当にまれな場合のみ)。代わりに、適切にオーバーライドpaintComponent()し、パラメーターを使用してGraphics必要なものを描画します。コンポーネントを更新する場合は、repaint()
  3. オーバーライドしないでくださいpaint、しかしオーバーライドしますpaintComponent()
  4. をオーバーライドしないpaintでくださいJFrame。そのための専用コンポーネントを使用してください。そのためにJLabelを使用する必要はありません。単純なJComponentもので十分です。
  5. JFrame機能を拡張しない場合は拡張しないでください。
  6. コンポーネントをコンポーネント階層に追加した後、revalidate()

これらの問題を修正し、それでも問題が解決しない場合は、別の質問に戻ってください。

このチュートリアルと次のいくつかの手順を読むことを検討する必要があります。それはあなたがやろうとしていることに似たものの基本的な例をあなたに示します。

編集:私はあなたのV2コードを取り、可能な限りパッチを当てました。これは完璧にはほど遠いですが、これを行う方法の要点を理解する必要があります。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class Fenetre extends JComponent {

    private boolean color;

    /**
     * Constructeur de l'objet
     */
    public Fenetre() {
        color = true;
        setPreferredSize(new Dimension(1000, 300));
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.white);
        g.fillRect(0, 0, 1000, 300);
        if (color) {
            g.setColor(Color.orange);
        } else {
            g.setColor(Color.blue);
        }
        g.fillRect(8, 25, 200, 100);
        g.setColor(Color.green);
        g.drawString("Text", 10, 10);
    }

    public void lol() {
        if (color) {
            color = false;
        } else {
            color = true;
        }
        repaint();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                initUI();
            }
        });
    }

    protected static void initUI() {
        JFrame frame = new JFrame();
        frame.setTitle("Animation");
        frame.setSize(1000, 400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);

        JPanel container = new JPanel();
        final JTextField jtf = new JTextField();
        final Fenetre fenetre = new Fenetre();
        JLabel label = new JLabel("Commandes   ");
        JButton b = new JButton("OK");
        container.setBackground(Color.white);
        container.setLayout(new BorderLayout());

        JPanel top = new JPanel();
        jtf.setPreferredSize(new Dimension(800, 30));
        class BoutonListener implements ActionListener {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (jtf.getText().equals("lol")) {
                    fenetre.lol();
                }
                System.out.println("Entry  : " + jtf.getText());
            }
        }
        b.addActionListener(new BoutonListener());

        top.add(fenetre);
        top.add(label);
        top.add(jtf);
        top.add(b);
        top.revalidate();
        frame.setContentPane(top);
        frame.setVisible(true);
    }
}
于 2012-05-24T23:13:02.200 に答える
3

Swingグラフィックプログラミングにはいくつかの重大な問題があります。これをより適切に行う方法を学ぶために、チュートリアルを実行することをお勧めします。たとえば、あなたは

  • paintメソッドを直接呼び出す-非常に特殊な状況を除いて、ほとんど絶対に行わないでください(これはそれらの1つではありません)
  • JFrameのpaint(...)メソッドで直接描画します。paintComponent(...)代わりに、JPanelなどのJComponentから派生したクラスのメソッドオーバーライドを描画する必要があります。
  • これがAWTプログラムであるかのように、不必要にupdateを呼び出します。ルックアンドフィールを変更しない限り、Swingではこれを行いません。

繰り返しになりますが、これに関するチュートリアルを見てください。これを行ったことを後悔することはありません。私を信じてください。

編集-遅すぎる!ギヨームに1+

于 2012-05-24T23:14:43.370 に答える