2

Im alright with java and have a fairly good understanding also but im stuck on a project im working on.. Im aattempting to move a JTextField to the left hand side of the screen but no matter what i try it stays centered at the top.. here is my code:

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();
      }
    });
  }
}
Roddy of the Frozen Peas
  • 14,380
  • 9
  • 49
  • 99
Delish
  • 77
  • 1
  • 12
  • 2
    1) Remove all the shouting. We are capable of reading lower-case letters as well 2) If you have a layout problem, then post code which only contains the relevant components and their layout. Strip all the listeners, ... (all logic code). That makes it far easier to debug the code – Robin Feb 05 '13 at 17:32
  • 1
    You didn't set layout for your canvas, so it uses default FlowLayout which ignores your `BorderLayout.LINE_START` constraints. – Mikhail Vladimirov Feb 05 '13 at 17:36

2 Answers2

3

Also:

canvas.setLayout(new BorderLayout());
Joop Eggen
  • 107,315
  • 7
  • 83
  • 138
2
  1. very good question, nice code posted here +1 for Swing Action

  2. don't do that canvas.setPreferredSize(new Dimension(CANVAS_WIDTH, CANVAS_HEIGHT)); override getPreferredSize inside class DrawCanvas extends JPanel {

  3. then all coordinates will be only getHeight/Weight for paintComponent() instead of hardcoding value for all Objects inside paintComponent()

  4. then all Objects will be / can be (depends of your ...) resizable with its parent

  5. put coordinates hardcoded as local variable to the array, and inside paintComponent() only loop in array

  6. use KeyBindings instead of KeyListener, then you can forgot for catching and hunting for Focus by setFocusable() for JPanel

Community
  • 1
  • 1
mKorbel
  • 109,525
  • 20
  • 134
  • 319