2012-04-13 5 views
0

Мое текстовое поле является локальным для основного, поэтому я не могу получить к нему доступ из actionPerformed, я считаю, что мне нужно сделать его переменной экземпляра, но я не уверен, как это сделать, потому что мой кадр также в основном, поэтому я не уверен, как бы потом добавить его в рамку.Я не уверен, как получить данные из моего текстового поля

import java.awt.*; 
import java.awt.event.*; 
import java.awt.image.*; 
import java.io.*; 
import javax.imageio.*; 
import javax.swing.*; 
import java.net.*; 
import java.sql.*; 
import java.lang.Object; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 

/** 
* This class demonstrates how to load an Image from an external file 
*/ 
public class Test extends JPanel { 

    int x=77, y=441, w=23, h=10; 

    BufferedImage img = 
    new BufferedImage(100, 50, 
        BufferedImage.TYPE_INT_ARGB);  
    // BufferedImage img; 

    public void paintComponent(Graphics g) { 
     g.drawImage(img, 0, 0, null); 
      // g.fillRect(10,10,10,10); 
    } 

    public Test() { 
     try { 
      img = ImageIO.read(new File("sales-goal.png")); 
     } catch (IOException e) {} 


     Graphics2D g = img.createGraphics(); 
     Color myColor = Color.decode("#32004b"); 
     g.setColor(myColor); 
     g.fillRect(x,y,w,h); 
       //77,441,23,10 
    } 

    public Dimension getPreferredSize() { 
     if (img == null) { 
      return new Dimension(100,100); 
     } else { 
      //return new Dimension(img.getWidth(null), img.getHeight(null)); 
      return new Dimension(300,600); 
     } 
    } 

    public static void main(String[] args) { 


     JFrame f = new JFrame("Load Image Sample"); 
     JTextField textField=new JTextField(); 
     f.add(textField); 
     textField.setBounds(10,10,40,30); 
     textField.setVisible(true); 

     f.addWindowListener(new WindowAdapter(){ 
       public void windowClosing(WindowEvent e) { 
        System.exit(0); 
       } 
      }); 

     f.add(new Test()); 
     f.pack(); 
     f.setVisible(true); 
    } 

    public void actionPerformed(ActionEvent e) { 
       //if (e.getSource() == textField) {} 

    } 
} 
+0

возможно дубликат [Я не уверен, как получить данные из моего текстового поля] (http://stackoverflow.com/questions/10145493/im-not-sure-how-to-get-the- data-from-my-text-field) и http://stackoverflow.com/questions/10147956/not-adding-textfield-to-jframe – kleopatra

ответ

0

Я думаю, что вы не должны настраивать свое приложение для качания таким образом. Вместо создания всего в методе main вы должны создать подкласс JFrame и выполнить инициализацию в его конструкторе (или что-то в этом роде). Затем этот класс может содержать ссылки на компоненты, которые он содержит. Пример:

public class TestFrame extends JFrame { 

    private JTextField textField; 

    public TestFrame() { 
     super("Load Image Sample"); 
     textField = new JTextField(); 
     this.add(textField); 
     textField.setBounds(10,10,40,30); 
     textField.setVisible(true); 

     this.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent e) { 
       System.exit(0); 
      } 
     }); 

     this.add(new Test()); 
     this.pack(); 
     this.setVisible(true); 
    } 

    public void actionPerformed(ActionEvent e) { 
     if (e.getSource() == textField) { 
      // ... 
     } 
    } 
} 
+0

спасибо за попытку быть полезными :-) К сожалению, ваш ответ имеет некоторые проблемы a) не подклассы конкретных J/Components, они предназначены для использования b) публично не раскрывают api, который не предназначен для публичного использования (без упущений вы этого не делаете, но тогда ActionListener не будет работать) c) никогда не звонит setBounds: определение местоположения/размер - это задача LayoutManager. d) добавление двух компонентов с тем же ограничением в BorderLayout скроет первый ... – kleopatra

-1

Метод actionPerformed обработки событий должно быть зарегистрировано с помощью ActionListener интерфейса. Поскольку и textField, и Test являются компонентами JFrame, логическим местом будет JFrame или отдельный класс контроллера, который соединяет все вместе.

Я переписал ваш код с более традиционным подходом к некоторым деталям. Для этого я представил новый класс MyFrame.

public class MyFrame extends JFrame implements ActionListener { 

    JTextField textField = new JTextField(); 

    public MyFrame(String title) { 
     super(title); // Or constructor without parameters and: 
     setTitle("Load Image Sample"); 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     //setLayout(...); for instance with null for absolute positioning 

     add(textField); 
     textField.setBounds(10, 10, 40, 30); 
     textField.setVisible(true); 

     Test panel = new Test(); 
     add(panel); 

     pack(); 
    } 

    public static void main(String[] args) { 
     JFrame f = new MyFrame("Load Image Sample"); 
     f.setVisible(true); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     System.out.println("Text: " + textField.getText()); 
    } 
} 

И тогда ваши JPanel

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.JPanel; 


/** 
* This class demonstrates how to load an Image from an external file 
*/ 
class Test extends JPanel { 

    int x = 77, y = 441, w = 23, h = 10; 
    BufferedImage img; 
    Color myColor = Color.decode("#32004b"); 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(myColor); 
     g.fillRect(x, y, w, h); 

     g.drawImage(img, 0, 0, null); 
     // g.fillRect(10,10,10,10); 
    } 

    public Test() { 
     setBackground(Color.red); 
     try { 
      img = ImageIO.read(new File("sales-goal.png")); 
     } catch (IOException e) { 
      img = new BufferedImage(100, 50, BufferedImage.TYPE_INT_ARGB); 
     } 
     setPreferredSize(new Dimension(300, 600)); 
    } 
} 
+0

-1 вы были предупреждены в своем комментарии к вашему комментарию в t он другой вопрос :) В основном: paintComponent недействителен. Плюс некоторые из пуль в моем комментарии к @ kyck-ling .. – kleopatra

+0

@ kleopatra;) критика оценили; здесь было немного изменить. –

0

создать рамку и инициализировать его в конструкторе.

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