0

こんにちは、パネルに絵を描いてフレームに追加する際に問題があります。

import java.awt.Graphics;
import java.awt.Image;
import java.util.Random;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class CardComponent extends JPanel {
int x;int y;
String[] str = {
           "D:\\Images\\ImageCards\\Clubs_Ace.png",
           "D:\\Images\\ImageCards\\Clubs_King.png",
           "D:\\Images\\ImageCards\\Clubs_Queen.png",
           "D:\\Images\\ImageCards\\Clubs_Jack.png",
           "D:\\Images\\ImageCards\\Clubs_10.png",
           "D:\\Images\\ImageCards\\Clubs_9.png",
           "D:\\Images\\ImageCards\\Clubs_8.png",
           "D:\\Images\\ImageCards\\Clubs_7.png",
           "D:\\Images\\ImageCards\\Clubs_6.png",
           "D:\\Images\\ImageCards\\Clubs_5.png",
           "D:\\Images\\ImageCards\\Clubs_4.png",
           "D:\\Images\\ImageCards\\Clubs_3.png",
           "D:\\Images\\ImageCards\\Clubs_2.png",
           "D:\\Images\\ImageCards\\Diamonds_Ace.png",
           "D:\\Images\\ImageCards\\Diamonds_King.png",
           "D:\\Images\\ImageCards\\Diamonds_Queen.png",
           "D:\\Images\\ImageCards\\Diamonds_Jack.png",
           "D:\\Images\\ImageCards\\Diamonds_10.png",
           "D:\\Images\\ImageCards\\Diamonds_9.png",
           "D:\\Images\\ImageCards\\Diamonds_8.png",
           "D:\\Images\\ImageCards\\Diamonds_7.png",
           "D:\\Images\\ImageCards\\Diamonds_6.png",
           "D:\\Images\\ImageCards\\Diamonds_5.png",
           "D:\\Images\\ImageCards\\Diamonds_4.png",
           "D:\\Images\\ImageCards\\Diamonds_3.png",
           "D:\\Images\\ImageCards\\Diamonds_2.png",
           "D:\\Images\\ImageCards\\Hearts_Ace.png",
           "D:\\Images\\ImageCards\\Hearts_King.png",
           "D:\\Images\\ImageCards\\Hearts_Queen.png",
           "D:\\Images\\ImageCards\\Hearts_Jack.png",
           "D:\\Images\\ImageCards\\Hearts_10.png",
           "D:\\Images\\ImageCards\\Hearts_9.png",
           "D:\\Images\\ImageCards\\Hearts_8.png",
           "D:\\Images\\ImageCards\\Hearts_7.png",
           "D:\\Images\\ImageCards\\Hearts_6.png",
           "D:\\Images\\ImageCards\\Hearts_5.png",
           "D:\\Images\\ImageCards\\Hearts_4.png",
           "D:\\Images\\ImageCards\\Hearts_3.png",
           "D:\\Images\\ImageCards\\Hearts_2.png",
           "D:\\Images\\ImageCards\\Spades_Ace.png",
           "D:\\Images\\ImageCards\\Spades_Ace.png",
           "D:\\Images\\ImageCards\\Spades_King.png",
           "D:\\Images\\ImageCards\\Spades_Queen.png",
           "D:\\Images\\ImageCards\\Spades_Jack.png",
           "D:\\Images\\ImageCards\\Spades_10.png",
           "D:\\Images\\ImageCards\\Spades_9.png",
           "D:\\Images\\ImageCards\\Spades_8.png",
           "D:\\Images\\ImageCards\\Spades_7.png",
           "D:\\Images\\ImageCards\\Spades_6.png",
           "D:\\Images\\ImageCards\\Spades_5.png",
           "D:\\Images\\ImageCards\\Spades_4.png",
           "D:\\Images\\ImageCards\\Spades_3.png",
           "D:\\Images\\ImageCards\\Spades_2.png"      
           };
   Image img;
     public CardComponent(int x,int y) {
         setOpaque(false);
         this.x = x;
         this.y = y;
         setSize(100,150);
         setVisible(true);


     }
     public void paint(Graphics g) {
         super.paint(g);
         Random r = new Random();
         String s = "";
         s = str[r.nextInt(str.length)];
         img = getToolkit().getImage(s);
         g.drawImage(img,this.x , this.y, 100, 150, this);
     }
     public static void main(String[] args) {
         CardComponent cc = new CardComponent(10,150);
         JFrame jfrm = new JFrame();
         jfrm.setSize(100, 150);
         jfrm.setVisible(true);
         jfrm.getContentPane().add(cc);
     }
 }

クラスupperが主な問題です(カードをペイントできません)。そして、これをメインフレームに追加しました(コードlower)。すべてのクラスにmainメソッドを追加して、正しく動作するかどうかを確認しました。java.awt.Button をインポートします。java.awt.Color をインポートします。import java.awt.event.ActionEvent; import java.awt.event.ActionListener;

  import javax.swing.JFrame;
  import javax.swing.JLabel;
  import javax.swing.JPanel;
  import javax.swing.JSlider;
  import javax.swing.event.ChangeEvent;
  import javax.swing.event.ChangeListener;


  public class PanelButtons extends JPanel{
Button but1;
Button but2;
    Button but3;
JLabel jlab;
JSlider jsl;
public PanelButtons() {
     setLayout(null);  
     Color c = new Color(0,120,0);
     setSize(700,200);
     setLocation(0,0);
     setOpaque(false);
     but1 = new Button("Check");
     but1.setBackground(Color.CYAN);
     but1.setLocation(660, 350);
     but1.setBounds(683, 650, 70, 40);
     add(but1);
     but2 = new Button("Fold");
     but2.setBackground(Color.CYAN);
     but2.setLocation(660, 350);
     but2.setBounds(753, 650, 70, 40);
     add(but2);
     but3 = new Button("Bet");
     but3.setBackground(Color.CYAN);
     but3.setLocation(660, 350);
     but3.setBounds(823, 650, 70, 40);
     add(but3);
     int money = Player.PremierMoney();
     jsl = new JSlider(0,1000);
     jsl.setMajorTickSpacing(50);
     jsl.setMinorTickSpacing(10);
     jsl.setLabelTable(jsl.createStandardLabels(100));
     jsl.setPaintTicks(true);
     jsl.setPaintLabels(true);
     jsl.setSize(400, 150);
     jsl.setBackground(c);
     jlab = new JLabel("Ваша ставка"+jsl.getValue());
     jsl.addChangeListener(new ChangeListener() {
        @Override
        public void stateChanged(ChangeEvent ce) {
            if(jsl.getValueIsAdjusting()) return;
            jlab.setText("Ваша ставка:"+jsl.getValue());

        }

     });
     jlab.setHorizontalTextPosition(JLabel.CENTER);
     jlab.setVerticalAlignment(JLabel.BOTTOM);
     jsl.setLocation(900,600);
     jlab.setLocation(150,150);
     add(jsl);
     add(jlab);
     but2.addActionListener(new ActionListener() {


         @Override
        public void actionPerformed(ActionEvent e) {
             but1.setEnabled(false);
             but2.setEnabled(false);
             but3.setEnabled(false);

        }
     });
}

public static void main(String[] args) {
    JFrame jfrm = new JFrame("Some frame");
    jfrm.setSize(200, 200);
    PanelButtons pb = new PanelButtons();
    jfrm.setContentPane(pb);
    jfrm.setVisible(true);
    jfrm.setDefaultCloseOperation(jfrm.EXIT_ON_CLOSE);
}
   }

このクラスは、ボタンとスライダーを記述します。java.awt.Color をインポートします。javax.swing.JFrame をインポートします。

    public class Images extends JFrame{
   Images() {
      // CardComponent cc = new CardComponent(530,550);
       PanelButtons pb = new PanelButtons();
       Color c = new Color(0,120,0);
    //  cc.setBounds(530, 550, 100, 150);
      setSize(1366,750); 
      setBackground(c);
      setContentPane(pb);
    //  setContentPane(cc);
      setVisible(true);
   }    




   public static void main(String[] args) {
       Images im = new Images();
       im.setResizable(false);
       im.setDefaultCloseOperation(EXIT_ON_CLOSE);
   }
    }

そして、これがパネルを追加するメイン フレームです。そのため、主な問題は、カードをどこにペイントするかです。手伝ってくれてありがとう。

4

2 に答える 2

3

プログラム全体にはnull多くの問題があります。レイアウトの選択は重要です。これは多くの問題を引き起こします。

しかし、あなたが直面している重大な問題はあなたのpaint方法にあります

public void paint(Graphics g) {
    super.paint(g);
    Random r = new Random();
    String s = "";
    s = str[r.nextInt(str.length)];
    System.out.println(s);
    img = getToolkit().getImage(s);
    g.drawImage(img, this.x, this.y, 100, 150, this);
}

この方法には3つの問題があります。

  1. をオーバーライドする必要がありますpaintComponent。これは、カスタム ペインティングを実行するためのより安全な方法です。
  2. ペイント サイクルごとに画像をランダムに再生成しています。コンポーネントはさまざまな理由でペイントされる可能性があり、ほとんどの場合、制御できないことを覚えておく必要があります。これは、コンポーネントがペイントされるたびに、新しいイメージがロードされることを意味します。コンポーネントの構築時に単一の画像をコンポーネントに割り当て、その画像をペイントする必要があります。
  3. コンポーネントに渡されたGraphicsコンテキストは、ポイント 0x0 がコンポーネントの左上隅になるように変換されています。これは、すべての絵画が相対的であることを意味します。

あなたのコードはこれを行います...

g.drawImage(img, this.x, this.y, 100, 150, this);

これは、画像がコンポーネントの上/左位置を基準にして x/y ピクセルで描画されることを意味します。代わりに、0x0 の位置をペイントする必要があります。

あなたの例では、あなたもそうします

jfrm.setVisible(true);
jfrm.getContentPane().add(cc);

これは一般的に悪い考えです。これら 2 つのステートメントを切り替える必要があります。そうしないと、何もペイントされていないように見えます。

一読する価値があるかもしれません

簡単な例で更新する

この例は、paintメソッドが取得できるヒット数と、ローカル座標空間の概念を示すことを目的としています。

ここに画像の説明を入力

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.io.File;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Cards {

    public static void main(String[] args) {
        new Cards();
    }

    public Cards() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame jfrm = new JFrame();
                jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                jfrm.setSize(100, 150);
                jfrm.setVisible(true);
                jfrm.add(new TestPane());
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            CardComponent cc = new CardComponent();
            setLayout(new GridBagLayout());
            add(cc);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            FontMetrics fm = g.getFontMetrics();
            // Simply render the location of the component relative to it's parent.
            for (Component comp : getComponents()) {
                String text = comp.getX() + "x" + comp.getY();
                g.drawString(text, comp.getX(), comp.getY() - fm.getHeight() + fm.getAscent());
            }
        }

    }

    public class CardComponent extends JPanel {

        String[] str;
        Image img;
        private int paintCount;

        public CardComponent() {
            File[] files = new File("C:\\Users\\swhitehead\\Documents\\My Dropbox\\MegaTokyo").listFiles();
            str = new String[files.length];
            for (int index = 0; index < files.length; index++) {
                str[index] = files[index].getPath();
            }
            setOpaque(false);
            setVisible(true);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(100, 150);
        }

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

        public void paint(Graphics g) {
            paintCount++;
            System.out.println(paintCount);
            super.paint(g);
            Random r = new Random();
            String s = "";
            s = str[r.nextInt(str.length)];
            img = getToolkit().getImage(s);
            // Drawing image in the top left corner of the component
            g.drawImage(img, 0, 0, 100, 150, this);
            g.setColor(Color.RED);
            g.drawRect(0, 0, getWidth(), getHeight());
            FontMetrics fm = g.getFontMetrics();
            String text = "Local 0x0";
            g.drawString(text, 0, fm.getAscent());
        }
    }
}

この例ではpaintCount、フレームに触れる前に 3640 を取得できました。

任意の方法で画像の読み込みを行うことpaintも悪い考えです。paintメソッドはできるだけ早く返される必要があります。そうしないと、プログラムのパフォーマンスが低下します。

于 2013-04-06T10:10:21.837 に答える
0

私はあなたのコードに少し混乱しています。オブジェクトが表示されません。クラスCardComponentのオブジェクトをインスタンス化してCardComponentから、それを自分JFrameまたはコンポーネントに追加する必要がありますJFrame...

Images im = new Images();
PanelButtons pb = new PanelButtons();
CardComponent cc = new CardComponent(x, y);
im.setContentPane(pb);
pb.setLayout(new BorderLayout());
pb.add(cc, BorderLayout.CENTER);

これは動作するプログラムではありませんが、うまくいけばアイデアが得られます。そして、コードをざっと読んだだけなCardComponentので、オブジェクトをインスタンス化する場所を見逃した可能性があります。それでも問題が解決しない場合は、この方法で画像を読み込んでみてください...

public void paint(Graphics g) {
     super.paint(g);
     Random r = new Random();
     String s = "";
     s = str[r.nextInt(str.length)];
     img = ImageIcon(s).getImage();
     g.drawImage(img,this.x , this.y, 100, 150, this);
 }

コードを実行したところ、もう 1 つ提案があります。CardComponentメソッドを使用してコンストラクターで境界を設定し、左上setBounds(x, y, 100, 150)隅 (0, 0) から右下 (100, 150) または (getWidth(), getHeight()) に画像を描画します。

うまくいけば、それが役に立ちます。

于 2013-04-06T09:39:42.997 に答える