2016-04-09 3 views
0

Я новичок в программировании на Java и имею «начальный вопрос». Я уже пытался найти, кто-то уже имел ту же проблему, но я не мог найти никаких сообщений, которые были на моем низком уровне.JButton доступен для нескольких панелей

Моя проблема: У меня есть 2 JPanels в одном из них (назовем это Panel1) Я реализую JTextField (поле1) и JButton (button1). на Panel2 Я хочу что-то нарисовать, в зависимости от того, что использует наконечник в первом JTextField.

Моя проблема в том, что Panel2 должен «видеть» эту кнопку1 (в Panel1), чего мне не удается.

Может ли кто-нибудь дать мне подсказку, видео на Youtube или что-то в этом роде, где я могу увидеть хороший пример, где кто-то справляется с такой проблемой?

Приветствия Ventura

PS У меня была идея, чтобы передать значения в panel2, где он должен рисовать те вещи, которые я хочу, вот мой код до сих пор (я надеюсь, что я его правильно): Вот ПАНЕЛЬ1:

public class Panel1 extends JPanel 
{ 
    public JButton button = new JButton("OK"); 
    public JTextField field1 = new JTextField(5); 
    public String name;int b; 

public Panel1() 
{ 
    setBackground(Color.WHITE); 
    add(field1); 
    add(button); 
    ButtonListener listener = new ButtonListener(field1); 
    button.addActionListener(listener); 
} 
public Dimension getPreferredSize() 
{ 
    return new Dimension(400,400); 
} 
} 

Здесь ButtonListener:

class ButtonListener implements ActionListener   
{  
Graphics g; 
//Graphics2D g2 = (Graphics2D) g; 
    public Panel2 pan2 = new Panel2(); 
    public String name; 
    public JTextField field1 = new JTextField(); 
    int b; 
    public ButtonListener(JTextField field1) 
    {this.field1 = field1;} 

    public void actionPerformed(ActionEvent e) 
    { 
     String op = e.getActionCommand(); 
     if(op.equals("OK")) 
     { 
      name = field1.getText(); 
     try 
      { 
       b = Integer.parseInt(name); 
       JOptionPane.showMessageDialog(null,"Ihre Zahl = "+b); 
       pan2.setvalue(b,g); 
      } 
     catch(NumberFormatException ex) {JOptionPane.showMessageDialog(null,"Please enter real numbers!");} 
     } 
    } 
    } 

и наконец panel2, где я хотел бы обратить вещи на основе ввода заданного в Panel1 (например: I типа в 10, и он рисует меня Rect угол с шириной 10 или что-то в этом роде)

public class Panel2 extends JPanel 
{  
Graphics g; 
Graphics2D g2 = (Graphics2D) g; 

public int b; 
public Panel2() 
{  
    setBackground(Color.YELLOW); 
} 

public void paintComponent(Graphics g) 
{ 
    Graphics2D g2 = (Graphics2D) g; 
    super.paintComponent(g); 
    g2.setColor(Color.RED); 
    g2.fillRect(200, 200, 50, 50); 
    Paint2(g); 
} 
public void Paint2(Graphics g) 
{ 
    this.g = g; 
    Graphics2D g2 = (Graphics2D) g; 
    //super.paintComponent(g); 
    System.out.println("TEST2"); 
    g2.setColor(Color.BLUE); 
    //System.out.println("TEST3"); 
    g2.fillRect(10 , 10, 40, 40); 
} 
public void setvalue(int b, Graphics g) 
{ 
this.b = b; 
this.g = g; 
Graphics2D g2 = (Graphics2D) g; 
g2.setColor(Color.CYAN); 
g2.fillRect(0, 0, 40, 40); 
System.out.println("B ist gleich = "+b); 
//Paint2(g2); 
} 
public Dimension getPreferredSize() 
{ 
return new Dimension(400,400); 
} 

Прошу прощения, если это немного громоздко читать. Моя основная проблема я получаю в этом коде является NullPointerException в panel2, когда я хочу, чтобы вызвать метод

SetValue (интермедиат б, графика г) g2.setColor (Color.Cyan)

Приветствие Patrick

ответ

0

Я сделал редизайн для большинства Panel1 и немного до Panel2.

Я собираюсь начать с Panel2, потому что это проще. Вот новый код:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 

import javax.swing.JPanel; 

public class Panel2 extends JPanel { 
    Graphics g; 
    Graphics2D g2; 

    public int b; 

    public Panel2() { 
     setBackground(Color.YELLOW); 
     b = 50; 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     g2 = (Graphics2D) g; 
     super.paintComponent(g); 
     g2.setColor(Color.RED); 
     g2.fillRect(200, 200, 50, 50); 

     g2.setColor(Color.BLUE); 
     g2.fillRect(10, 10, 40, 40); 

     g2.setColor(Color.CYAN); 
     g2.fillRect(b, b, 40, 40); 
    } 

    public void setValue(int b) { 
     this.b = b; 
     System.out.println("B ist gleich = " + b); 
     repaint(); 
    } 

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

Самое большое изменение, которое я сделал в panel2, что я сделал g2 переменная класса, что все методы можно использовать. Вместо того, чтобы каждый раз использовать методы Graphics, я просто сделал так, чтобы они могли использовать один из класса. Я также не делал новую переменную Graphics2D «равным» при каждом вызове метода, потому что в этом не было необходимости. Единственным местом, где я его обновил, был метод paintComponent(), чтобы я мог его один раз обновить для всего класса.

Следующая панель Panel1. Вот код:

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

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

public class Panel1 extends JPanel { 
    public JButton button = new JButton("OK"); 
    public JTextField field1 = new JTextField(5); 
    public String name; 
    int b; 
    private Panel2 pan2; 

    public Panel1() { 
    setBackground(Color.WHITE); 
    add(field1); 
    add(button); 
    ActionListener listener = new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      String op = e.getActionCommand(); 
      if (op.equals("OK")) { 
       name = field1.getText(); 
       try { 
        b = Integer.parseInt(name); 
        pan2.setValue(b); 
        JOptionPane.showMessageDialog(null, "Ihre Zahl = " + b); 
       } catch (NumberFormatException ex) { 
        JOptionPane.showMessageDialog(null, "Please enter real numbers!"); 
       } 
      } 

     } 
    }; 
    button.addActionListener(listener); 
} 

public void setSecondPanel(Panel2 panel) { 
    pan2 = panel; 
} 

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

public static void main(String[] args) { 
    JFrame frame = new JFrame(); 
    Panel1 pan1 = new Panel1(); 
    Panel2 pan2 = new Panel2(); 
    pan1.setSecondPanel(pan2); 
    frame.setSize(pan1.getPreferredSize().width + pan2.getPreferredSize().width, pan1.getPreferredSize().height); 
    frame.add(pan2, BorderLayout.EAST); 
    frame.add(pan1, BorderLayout.WEST); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 
} 

} 

Прежде всего, обратите внимание, как я не создавал ButtonListener. Поскольку вы используете его только один раз, нет необходимости создавать для него новый класс (это также меньше кода).

В методе main() я сделал это так, чтобы он добавлял обе панели к противоположным сторонам, чтобы они не перекрывали друг друга или что-то еще.

И наконец, я создал метод setSecondPanel в классе Panel1, так что у класса была бы переменная для работы в любой момент.

+0

Здравствуйте, большое спасибо за ваш ответ. Я применил ваши подсказки, и я разместил код, чтобы четко указать, где моя проблема. (Основной метод, который я не размещаю, чтобы он четко размещался. – Ventura

+0

Если бы это помогло, вы бы не упустили его и не проверили? – Eames

+0

Hi Большое спасибо за вашу помощь, это очень полезно :), но есть одна мелочь, которую я до сих пор не получаю; вероятно, вы можете мне помочь: я хотел бы, чтобы код «перекрашивал» вещи; как вы можете видеть в Panel2 в методе setValue, он говорит g2.fillRect (...), но на самом деле он не рисует Rectangle в Panel1, когда я что-то опрокидываю. Есть ли способ исправить это? – Ventura