2016-02-18 57 views
0

如何從一個函數中返回一個JButton並用它在不同的類中執行一個動作,我正在創建一個僅用於練習我的java技巧的庫(我缺少這個部分),而且我正在嘗試使它通過創建對象和函數來創建JFrames和JButtons更簡單,問題是,在Frame.java我回來了JButton在那裏創建,然後使用它與ActionListener,但問題是,它既沒有顯示錯誤也沒有工作,有人可能會給我一個解釋,如果可能的話,解決方案?如何從函數中返回一個JButton並將其用於在java中的其他類中執行操作?

按Ctrl + F:9812934 |從那裏我返回JButton,並在那裏我用它進行切換。

Main.java

package twopackages; 

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 


import lib.Button; 
import lib.Frame; 

public class Main extends Frame{ 
    public static void main(String[] args){ 

     Frame frame = new Frame(); 
     Button button = new Button(); 

     frame.width = 400; 
     frame.height = 300; 
     frame.title = "title"; 
     frame.visible = true; 

     button.width = 100; 
     button.height = 30; 
     button.title = "button"; 
     button.top = 10; 
     button.left = 10; 
     button.visible = true; 

     frame.addButton(button); 

     frame.run(); 

     frame.addButton(button).addActionListener(new ActionListener() {//Get JButton returned after calling function (I know it's crappy, but I could not find a way to do something similar) 9812934 
      public void actionPerformed(ActionEvent arg0) { 
       System.out.println("sadasdasd"); 
      } 
     }); 


    } 

} 

Frame.java

package lib; 

import javax.swing.JButton; 
import javax.swing.JFrame; 

import lib.Button; 

public class Frame { 
    public int width; 
    public int height; 
    public String title; 
    public boolean visible; 

    JFrame FRAME = new JFrame(); 

    public void run(){ 
     FRAME.setSize(width, height); 
     FRAME.setTitle(title); 
     FRAME.setLayout(null); 
     FRAME.setLocationRelativeTo(null); 
     FRAME.setVisible(visible); 
     FRAME.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     FRAME.setResizable(false); 
    } 

    public JButton addButton(Button button){ 
     JButton BUTTON = new JButton(); 
     BUTTON.setText(button.title); 
     BUTTON.setBounds(button.left, button.top, button.width, button.height); 
     BUTTON.setVisible(button.visible); 
     FRAME.add(BUTTON); 
     return BUTTON;//Here's where I return the JButton 9812934 
    } 

} 

Button.java

package lib; 

import javax.swing.JButton; 

public class Button{ 

    public int left; 
    public int top; 
    public int width; 
    public int height; 
    public String title; 
    public boolean visible; 

    JButton button = new JButton(); 

    public void button(){ 
     button.setBounds(left, top, width, height); 
     button.setText(title); 
     button.setVisible(visible); 
    } 
} 
+0

1)Java GUI必須使用不同語言環境中使用不同PLAF的不同OS,屏幕大小,屏幕分辨率等。因此,它們不利於像素的完美佈局。請使用佈局管理器或[它們的組合](http://stackoverflow.com/a/5630271/418556)以及[white space]的佈局填充和邊框(http://stackoverflow.com/a/17874718/ 418556)。 2)請學習常用的Java命名規則(命名約定 - 例如'EachWordUpperCaseClass','firstWordLowerCaseMethod()','firstWordLowerCaseAttribute',除非它是'UPPER_CASE_CONSTANT')並且一致地使用它。 –

回答

2

由於您創建了JButton的兩個實例並將它們相互疊加,所以您的代碼不起作用,這正是@Andrew在他的評論中警告你。當你點擊按鈕時,你實際上是點擊了沒有附加動作監聽器實現的那個。

下面是相關位:

//frame.addButton(button); // <-- first instance created and added 

frame.run(); 

// ˇ second instance created and added 
frame.addButton(button).addActionListener(new ActionListener() {//Get JButton returned after calling function (I know it's crappy, but I could not find a way to do something similar) 9812934 
    public void actionPerformed(ActionEvent arg0) { 
     System.out.println("sadasdasd"); 
    } 
}); 

簡單的註釋你的框架的第一次調用修復客戶端代碼。

試圖簡化Swing相當麻煩,你已經採取了自己。榮譽給你。傳遞JButton對象沒有任何問題,只要確保傳遞正確的對象。

注意:您正在調用不是事件調度線程的線程的Swing代碼。如果你的年輕框架有任何希望工作正常,你需要解決這個問題(將所有內容都包含在SwingUtilities.invokeLater(Runnable)中)。

+0

哦,這是完全正確的,我現在看到它,它的工作原理,感謝解釋和建議+ 1 – Kyle

0

您應該添加按鈕t o幀的contentPane而不是自己的Frame。總是建議在Panel的級別上工作,而不是擺動中的框架

相關問題