2

シンプルな数独ゲームを作成しています。これは私の最初の「大物」であるため、すべてを自分で行いたいと考えています (GUI を作成するために通常使用する NetBeans インターフェイスデザイナーは使用しません)。そこで、GUI のために、JApplet を拡張するクラスを作成し、paint() メソッドで単純な数独フィールドを描画しました。

ここで、それぞれが 1 つの数値を受け取る 81 個のテキスト フィールドを作成する必要があります。それらを画面上に配置するにはどうすればよいですか? また、配列を作成することを考えていたので、1 つの for ループでフィールドのエニトレ マトリックスを変更できるようになります。

4

1 に答える 1

6

提案:

  • paintJApplet、JFrame、JDialog などの最上位コンポーネントのメソッドで直接描画しないでください。
  • カスタム描画を行う必要がある場合は、代わりにpaintComponent(...)、JPanel や JComponent 自体など、JComponent を拡張するコンポーネントのメソッド オーバーライドでこれを行います。
  • あなたの問題は、少なくともまだカスタムペイントを必要とせず、他の手段ではるかに優れており、より簡単に解決できます。
  • JLabels、JTextFields などのコンポーネントを使用し、Swing レイアウト マネージャーを使用してそれらを配置します (上記の他の手段)。これを使用する方法に関するチュートリアルをここで見つけることができます:コンテナ内のコンポーネントのレイアウト
  • 最初に注目すべきレイアウトには、数独の「セル」の GridLayout と GUI 全体の BorderLayout が含まれます。少なくとも最初は、GridBagLayout と GroupLayout を使用しないでください。
  • それぞれが単純なレイアウト マネージャーを使用する JPanel をネストすることで、複雑なアプリケーションを作成できることに注意してください。
  • グリッド線を「ペイント」する簡単な方法は、GridLayout を使用し、JTextFields を保持する JPanel の背景色を Color.BLACK に設定することです。また、GridBagLayout に垂直方向と水平方向に小さなギャップを与えて、黒が透けて見えるようにしてください。上記のチュートリアルは、これを行う方法を示しています。
  • これが私のアプリケーションなら、アプリケーションを保持する JPanel を作成するように GUI を調整します。次に、JApplet で表示する必要がある場合は、JApplet をサブクラス化する非常に小さなアプリケーションを作成し、init()メソッドで数独 JPanel を JApplet の contentPane に追加します。このように、代わりに JFrame でアプリを表示したい場合は、JFrame を作成する別の小さなクラスを作成し、数独 JPanel を JFrame の contentPane に追加してから、JFrame を呼び出すだけpack()で済みます。それからsetVisible(true)

JPanel を JApplet に追加する方法に関する質問については、チュートリアルでこれを行う方法が示されます。チュートリアルの大きなインデックスにリンクしていない場合は、そうする必要があります: The Really Big Index .

非常に単純な例は次のようになります。

import java.lang.reflect.InvocationTargetException;
import javax.swing.*;

public class MyApplet extends JApplet {
   @Override
   public void init() {
      try {
         SwingUtilities.invokeAndWait(new Runnable() {
            public void run() {
               getContentPane().add(new MyJPanel());             
            }
         });
      } catch (InterruptedException e) {
         e.printStackTrace();
      } catch (InvocationTargetException e) {
         e.printStackTrace();
      }
   }
}
于 2012-02-18T15:14:12.157 に答える