2

我对 java 很好,也有很好的理解,但我坚持一个项目,我正在处理.. 我试图将 JTextField 移动到屏幕的左侧,但无论我尝试什么,它都保持在顶部居中..这是我的代码:

public class Display extends JFrame{
  public static final int CANVAS_WIDTH = 1000;
  public static final int CANVAS_HEIGHT = 450;
  public static final Color LINE_COLOR = Color.BLACK;
  public static final Color GROUND_COLOR = Color.GREEN;
  public static final Color CANVAS_BACKGROUND = Color.CYAN;
  public static final Color TRANS = Color.CYAN;

  private int x1 = CANVAS_WIDTH / 2;
  private int y1 = CANVAS_HEIGHT / 2;
  private int x2 = CANVAS_WIDTH /2;
  private int y2 = CANVAS_HEIGHT / 2;

  private int Sx1 = CANVAS_WIDTH ;
  private int Sy1 = CANVAS_HEIGHT ;
  private int Sy2 = CANVAS_HEIGHT ; 

  private int Rx1 = CANVAS_WIDTH - CANVAS_WIDTH;
  private int Ry1 = CANVAS_HEIGHT;
  private int Rx2 = CANVAS_WIDTH;
  private int Ry2 = CANVAS_HEIGHT ;

  private int Lx1 = CANVAS_WIDTH / 2;
  private int Ly1 = CANVAS_HEIGHT / 2;
  private int Lx2 = CANVAS_WIDTH / 2;
  private int Ly2 = CANVAS_HEIGHT / 2;

  private int Mx1 = CANVAS_WIDTH / 2;
  private int My1 = CANVAS_HEIGHT / 2;
  private int Mx2 = CANVAS_WIDTH / 2;
  private int My2 = CANVAS_HEIGHT / 2;

  int[] xs = {380, 460, 460, 540, 540, 620, 500, 380};
  int[] ys = {260, 260, 250, 250, 260, 260, 205, 260};

  private DrawCanvas canvas;
  private JTextField tfCount;
  private int count = 0;

  public class CountUpAction extends AbstractAction {
    /** Constructor */
    public CountUpAction(String name, String shortDesc, Integer mnemonic) {
       super(name);
       putValue(SHORT_DESCRIPTION, shortDesc);
       putValue(MNEMONIC_KEY, KeyEvent.VK_NUMPAD4);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
      addKeyListener(new KeyAdapter() {
        public void keyPressed(KeyEvent evt) {
          switch(evt.getKeyCode()) {
          case KeyEvent.VK_NUMPAD1:

            //original count
            count += 1;
            tfCount.setText(count + "");

          }
        }
        });
      }
    }

public class CountDownAction extends AbstractAction {
    /** Constructor */
    public CountDownAction(String name, String shortDesc, Integer mnemonic) {
       super(name);
       putValue(SHORT_DESCRIPTION, shortDesc);
       putValue(MNEMONIC_KEY, KeyEvent.VK_NUMPAD5);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
      addKeyListener(new KeyAdapter() {
      public void keyPressed(KeyEvent evt) {
        switch(evt.getKeyCode()) {
        case KeyEvent.VK_NUMPAD2:

      //original count
      count -= 1;
      tfCount.setText(count + "");

        }
      }
      });
    }
  }

  public Display() {
    canvas = new DrawCanvas();
    canvas.setPreferredSize(new Dimension(CANVAS_WIDTH, CANVAS_HEIGHT));

    Container cp = getContentPane();
    cp.setLayout(new BorderLayout());
    cp.add(canvas, BorderLayout.LINE_START);

     // Create the Actions shared by the button and menu-item
    Action countUpAction = new CountUpAction("Count Up",
          "", new Integer(KeyEvent.VK_ENTER));
    Action countDownAction = new CountDownAction("Count Down",
          "", new Integer(KeyEvent.VK_D));

    canvas.add(new JLabel("alt+4: activeate up"));
    canvas.add(new JLabel("alt+5: activate down"));
    tfCount = new JTextField("0", 8);
    tfCount.setHorizontalAlignment(JTextField.CENTER);
    tfCount.setEditable(false);
    canvas.add(tfCount, BorderLayout.LINE_START);
    //Invisible
    JButton btnCountUp = new JButton();
    btnCountUp.setFocusable(false);
    btnCountUp.setHideActionText(true);
    btnCountUp.setContentAreaFilled(false);
    btnCountUp.setBorderPainted(false);
    canvas.add(btnCountUp, DrawCanvas.LEFT_ALIGNMENT);
    //Invisible
    JButton btnCountDown = new JButton();
    btnCountDown.setFocusable(false);
    btnCountDown.setHideActionText(true);
    btnCountDown.setContentAreaFilled(false);
    btnCountDown.setBorderPainted(false);

    canvas.add(btnCountDown);
    // Set actions for buttons
    btnCountUp.setAction(countUpAction);
    btnCountDown.setAction(countDownAction);

addKeyListener(new KeyAdapter() {
  public void keyPressed(KeyEvent evt) {
    switch(evt.getKeyCode()) {
    case KeyEvent.VK_LEFT:
      Rx1 -= 10;    Ry1 += 10;
      Rx2 += 10;    Ry2 -= 10;
      x1 -=10;    x2 +=10;
      Lx1 -= 10;    Lx2 -= 10;
      Mx1 += 10;    Mx2 -= 10;
      repaint();
      break;
    case KeyEvent.VK_RIGHT:
      Rx1 -= 10;    Ry1 -= 10;
      Rx2 += 10;    Ry2 += 10;
      x1 += 10;    x2 += 10;
      Lx1 += 10;    Lx2 += 10;
      Mx1 -= 10;    Mx2 += 10;
      repaint();
      break;
    case KeyEvent.VK_DOWN:
          y1 -= 10;    y2 -= 10;
          Ly1 -= 10;    Ly2 -= 10;
          Sy1 += 10;    Sy2 -= 10;
          Ry1 +=10;    Ry2 += 10;
          repaint();
          break;
        case KeyEvent.VK_UP:
          y1 += 10;    y2 += 10;
          Ly1 += 10;    Ly2 += 10;
          Sy1 -= 10;    Sy2 += 10;
          Ry1 -= 10;    Ry2 -= 10;
          repaint();
          break;
        case KeyEvent.VK_M:
          System.exit(0);
        }
      }
    });

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setTitle("FLIGHT DISPLAY");
    pack();
    setVisible(true);
    requestFocus();
  }

  class DrawCanvas extends JPanel {
    public void paintComponent(Graphics g) {
      super.paintComponent(g);
      setBackground(CANVAS_BACKGROUND);

      g.setColor(GROUND_COLOR);
      //Draw ground Color
      g.drawRect(Sx1 - Sx1,Sy1 /2, CANVAS_WIDTH, Sy2 /2);
      g.fillRect(Sx1 - Sx1, Sy1 /2, CANVAS_WIDTH, Sy2 /2);
      g.setColor(LINE_COLOR);
      //Draw line centre horizontal
      g.drawLine(Rx1, Ry1 /2, Rx2, Ry2 /2);
      g.drawOval(x1 -15, y1 -15, 30, 30);
      g.fillOval(x1 - 5, y1 -5, 10, 10);
      //Draw line centre vertical
      g.drawLine(Mx1, My1 + My1, Mx2, My2 - My2);
      //Draw line dim
      g.setColor(Color.YELLOW);
      g.fillArc(300, 0, 400, 140, 0, 180);
      g.setColor(LINE_COLOR);
      g.drawLine(Lx1 -25, Ly1 +20, Lx2 +25, Ly2 +20);
      g.drawLine(Lx1 -50, Ly1 +40, Lx2 +50, Ly2 +40);
      g.drawLine(Lx1 -25, Ly1 +60, Lx2 +25, Ly2 +60);
      g.drawLine(Lx1 -75, Ly1 +80, Lx2 +75, Ly2 +80);
      g.drawLine(Lx1 -25, Ly1 +100, Lx2 +25, Ly2 +100);
      //Draw line dim
      g.drawLine(Lx1 -25, Ly1 -20, Lx2 +25, Ly2 -20);
      g.drawLine(Lx1 -50, Ly1 -40, Lx2 +50, Ly2 -40);
      g.drawLine(Lx1 -25, Ly1 -60, Lx2 +25, Ly2 -60);
      g.drawLine(Lx1 -75, Ly1 -80, Lx2 +75, Ly2 -80);
      g.drawLine(Lx1 -25, Ly1 -100, Lx2 +25, Ly2 -100);
      //Draw polyline centre plane
      g.drawPolyline(xs, ys, 8);

      g.drawArc(300, 0, 400, 140,  0, 180);
      g.drawLine(Mx1+30, My1 + My1, Mx2, My2 - My2);
      g.drawLine(Mx1-30, My1 + My1, Mx2, My2 - My2);

      g.drawString(Ccount, 100,100);

    }
  }

  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        new Display();
      }
    });
  }
}
4

2 回答 2

3

还:

canvas.setLayout(new BorderLayout());
于 2013-02-05T17:36:31.140 回答
2
  1. 非常好的问题,这里发布了很好的代码+1Swing Action

  2. 不要在里面做那个canvas.setPreferredSize(new Dimension(CANVAS_WIDTH, CANVAS_HEIGHT));覆盖getPreferredSizeclass DrawCanvas extends JPanel {

  3. 那么所有坐标将仅getHeight/Weight用于paintComponent()而不是硬编码所有Objects内部的值paintComponent()

  4. 那么所有的都Objects将/可以(取决于你的......)与其父级一起调整大小

  5. 将坐标硬编码为数组的局部变量,并且paintComponent()仅在数组中循环

  6. 使用KeyBindings instead of KeyListener, 那么你可以忘记 for 抓捕 for Focusby setFocusable()forJPanel

于 2013-02-05T19:09:06.530 回答