1. 關於java swing 中,事件的問題
可以把JBa .addActionListener(this);這句改成其他的:
比如:JBa .addActionListener(A,B類的某個成員欄位);
我的意思是,按鈕就在A,B、中定義,然後在A類中(B類類似不再重復)的構造函數中new出來並注冊時間監聽,那麼問題來了,誰來監聽?建議構造函數這樣寫:
public A(ActionListener lst){
this.按鈕=new Button()//等實例操作,把按鈕的所有屬性設置好後-->
this.按鈕.setActionListener(lst);//把傳入的參數設為監聽的對象
}
新的問題就是,需要在C類中new A時,就把自己(建議把自己)實現ActionLIstener,然後傳入參數就是自己(this):A a =new A(this);
大概是這樣,如果要把按鈕分離出來,就可以考慮直接new Jpanel()再對象.add()了!
2. java swing 怎麼用一個監視器 監視2個窗口中同名按鈕(各一個),觸發不同事件(執行不同代碼)
package實驗;
importjavax.swing.*;importjava.awt.event.*;
publicclasshaha{
publicstaticvoidmain(String[]args){
//調用c來啟動
newc();
}
}
classaextendsJFrame{
//第一個按鈕
JButtons=newJButton("ha");
a(){
this.setTitle("a!");
this.setVisible(true);
this.setLayout(null);
this.setBounds(100,100,600,600);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.add(s);
s.setBounds(100,100,100,50);
}
}
classbextendsJFrame{
//第二個按鈕
JButtons=newJButton("ha");
b(){
this.setTitle("b!");
this.setVisible(true);
this.setLayout(null);
this.setBounds(100,100,600,600);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.add(s);
s.setBounds(100,100,100,50);
}
}
{
//啟動a,b
aaa=newa();
bbb=newb();
c(){
//為兩個按鈕加監聽器
aa.s.addActionListener(this);
bb.s.addActionListener(this);
}
publicvoidactionPerformed(ActionEvente){
//如果是a的按鈕
if(e.getSource()==aa.s){
System.out.println("我點了a的s");
}
//如果是b的按鈕
if(e.getSource()==bb.s){
System.out.println("我點了b的s");
}
}
}
3. 請簡要說明Java基於SWING的圖形用戶界面設計中的事件機制及處理事件的步驟 謝謝了,簡要
在編程語言中的事件就是當某組件的狀態發生改變的時候通知其它對象發生了這件事,我們在這里只討論圖形界面的組件,有可能是按鈕、文本框、菜單、多選等等。
對於通知其它對象的方法一般有兩種模式:
1)推模式:狀態改變的對象通知其它對象;
2)拉模式:其他對象不停的查看該對象狀態是否發生改變。
例如我去小賣部買煙,要一包紅塔山,結果小賣部沒貨了,如果我把我得電話給小賣部老闆,煙如果到了請給我打電話,這就是推模式。如果我每隔5分鍾來小賣部看一看煙是否到了,這就是拉模式。
Java採用的是推模式,所有監聽事件都基於觀察者設計模式,所以我們也可以自己給予觀察者開發出專用的監聽器。
我們JavaGUI程序開發,會經常使用到監聽事件,比如一個小計算器的程序,當我們點擊「計算」按鈕後,希望程序將兩個文本框中的數字相加,那麼就必需給這個按鈕添加事件:
1)按鈕的動作觸發事件介面是ActionListener介面(不同組件要實現不同功能需要有不同的介面),我們需要寫一個事件類,實現ActionListener介面,介面中需要我們實現的方法actionPerformed(ActionEvent e)代表了當按鈕事件被觸發後需要程序做些什麼,比如在這里用System.out.println("你好")在控制台列印你好,這一步就相當於我把電話寫在紙上。
2)調用JButton組件實例的addActionListener(ActionListener al)方法(其它事件也有相應的方法)將上面寫的事件類注冊到這個按鈕上,這就相當於我把寫著電話的紙條交給小賣部的老闆。
上述兩部工作完成後,這個按鈕的事件就添加完成了,程序運行,點擊按鈕,動作事件被觸發,控制台顯示「你好」。
實例:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
/**
* 一個簡單的按鈕事件教學實例
* @author 米強
*
*/
public class Test extends JFrame {
public Test() {
super("簡單的按鈕事件實例");
// 一個按鈕的實例化對象
JButton button = new JButton("按鈕");
// 構造一個事件類,該類實現了ActionListener動作介面
MyActionListener action = new MyActionListener();
// 為這個按鈕添加動作事件(匿名類等寫法在這里不做討論)
button.addActionListener(action);
// 將按鈕添加到窗體中
getContentPane().add(button);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(300, 200);
setLocationRelativeTo(null);
setVisible(true);
}
public static void main(String[] args) {
new Test();
}
}
/**
* 事件類,實現ActionListener介面
* @author 米強
*
*/
class MyActionListener implements ActionListener {
/**
* 動作事件出發後所執行的方法
*/
public void actionPerformed(ActionEvent e) {
// 在控制台列印「你好」
System.out.println("你好");
}
}
4. java中swing的問題,關於按鈕下面也有按鈕時候事件的觸發
按鈕是我用label模仿的,button上添加事件後沒法觸發底層的滑鼠事件,不知道如何解決,下面是我實現的代碼,拖動的動畫效果還沒想出好的辦法, 裡面有獲取屏幕高寬的方法,可以實現panel居中,button相對於屏幕坐標的方法是在事件里調用e.getXOnScreen();e.getYOnScreen()這兩個方法:
public class Test {
public static void main(String[] args)
{
new Test().new MyFrame();
}
class MyFrame extends JFrame{
JLabel testBtn = new JLabel("test:");
int x;//x坐標
int y;//y坐標
public MyFrame(){
Dimension ss = Toolkit.getDefaultToolkit().getScreenSize();//獲取屏幕大小
//獲取內邊距
Insets screenInsets = Toolkit.getDefaultToolkit().getScreenInsets(this.getGraphicsConfiguration());
int taskBarHeight = screenInsets.bottom; //獲取底部 菜單欄高度
setBounds(ss.width/10, (ss.height-taskBarHeight)/10, ss.width/5*4, (ss.height-taskBarHeight)/5*4);
setLayout(null);
testBtn.setBounds(0, 0, 150, 30);
testBtn.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
addMouseListener(new MouseAdapter() {
boolean flag = false;
int xMax;
int xMin;
int yMax;
int yMin;
@Override
public void mousePressed(MouseEvent e) {
System.out.println("x="+e.getX()+";y="+e.getY());
xMax = testBtn.getX()+testBtn.getWidth();
xMin = testBtn.getX();
//這里加了個30是標題欄的高度,如果有目錄欄,還需要加
yMax = testBtn.getY()+testBtn.getHeight()+30;
yMin = testBtn.getY();
//滑鼠點下位置為按鈕部分
System.out.println(e.getX()+";"+e.getY());
System.out.println(xMin+";"+xMin);
System.out.println(yMin+";"+yMin);
System.out.println(e.getX()>xMin&&e.getX()<xMax&&e.getY()<yMax&&e.getY()>yMin);
if(e.getX()>xMin&&e.getX()<xMax&&e.getY()<yMax&&e.getY()>yMin){
flag =true;
testBtn.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
testBtn.setLocation(e.getX()-testBtn.getWidth()/2, e.getY()-30-testBtn.getHeight()/2);
}else{
flag =false;
}
}
@Override
public void mouseReleased(MouseEvent e) {
if(flag ==true){
testBtn.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
testBtn.setLocation(e.getX()-testBtn.getWidth()/2, e.getY()-30-testBtn.getHeight()/2);
}
}
});
add(testBtn);
setVisible(true);
}
}
}
5. 關於java swing的按鈕點擊事件,請教大俠們
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class MainFrame {
private JFrame frame = new JFrame();
private JButton add = new JButton("添加");
private JButton del = new JButton("刪除");
private JButton update = new JButton("修改");
private JPanel panel = new JPanel();
private JTextArea message = new JTextArea(10, 20);
private JScrollPane message_pane = new JScrollPane(message);
private JTextField name = null;
private JTextField password = null;
private JScrollPane update_message_pane = null;
private JTextArea update_message = null;
public static void main(String[] args) {
MainFrame mf = new MainFrame();
mf.init();
mf.addActionListener();
}
// 向文本域添加值
private class Enroll_BtnAction implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (!name.getText().equals("") && !password.getText().equals("")) {
message.append("姓名:" + name.getText() + " " + "密碼:"
+ password.getText());
} else {
System.out.println("用戶名密碼為空");
}
}
}
private class Update_BtnAction implements ActionListener {
public void actionPerformed(ActionEvent e) {
message.setText(update_message.getText());
}
}
// 為按鈕添加事件
public void addActionListener() {
ActionListener add_action = new ActionListener() {
public void actionPerformed(ActionEvent e) {
JDialog enroll_dialog = new JDialog(frame, "注冊", true);
JLabel name_t = new JLabel("姓名");
name = new JTextField(10);
JLabel password_t = new JLabel("密碼");
password = new JTextField(10);
JButton enroll_ok = new JButton("確定");
enroll_dialog.setLayout(new FlowLayout());
enroll_dialog.add(name_t);
enroll_dialog.add(name);
enroll_dialog.add(password_t);
enroll_dialog.add(password);
enroll_dialog.add(enroll_ok);
enroll_dialog.setBounds(20, 10, 180, 350);
enroll_ok.addActionListener(new Enroll_BtnAction());
enroll_dialog.setVisible(true);
}
};
// 清空文本域
ActionListener del_action = new ActionListener() {
public void actionPerformed(ActionEvent e) {
message.setText("");
}
};
ActionListener update_action = new ActionListener() {
public void actionPerformed(ActionEvent e) {
JDialog update_dialog = new JDialog(frame, "修改", true);
update_message= new JTextArea(18,20);
update_message_pane= new JScrollPane(update_message);
JButton update_ok = new JButton("確定");
update_message.setText(message.getText());
update_message.setWrapStyleWord(true);
update_dialog.add(update_message_pane);
update_dialog.add(update_ok);
update_dialog.setLayout(new FlowLayout());
update_dialog.setBounds(600, 100, 240, 400);
update_ok.addActionListener(new Update_BtnAction());
update_dialog.setVisible(true);
}
};
add.addActionListener(add_action);
del.addActionListener(del_action);
update.addActionListener(update_action);
}
// 控制項初始化
public void init() {
frame.setBounds(100, 100, 400, 400);
panel.setLayout(new FlowLayout());
panel.add(add);
panel.add(del);
panel.add(update);
panel.add(message_pane);
message.setEditable(false);
frame.add(panel);
frame.setVisible(true);
frame.setDefaultCloseOperation(3);
}
}
6. 在java swing中如何實現通過代碼按下一個按鈕
API中的內容:
從類來 javax.swing.AbstractButton 繼承的方法
doClick
public void doClick()
以編程源方式執行「單擊」。此方法的效果等同於用戶按下並隨後釋放按鈕。
doClick
public void doClick(int pressTime)
以編程方式執行「單擊」。此方法的效果等同於用戶按下並隨後釋放按鈕。按鈕在虛擬「按下」狀態下停留 pressTime 毫秒的時間。
參數:
pressTime - 「按下」按鈕的時間,以毫秒為單位
7. Java給按鈕添加事件
示例代碼如下:
importjava.awt.FlowLayout;
importjava.awt.event.*;
importjavax.swing.*;
{
publicDemo10(){
this.setTitle("按鈕測試");
this.setSize(300,200);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setLayout(newFlowLayout());
JButtonbutton1=newJButton("按鈕1");
//傳統按鈕監聽器添加方式
button1.addActionListener(newActionListener(){
@Override
publicvoidactionPerformed(ActionEventarg0){
JOptionPane.showMessageDialog(null,"我是按鈕1!");
}
});
this.add(button1);
JButtonbutton2=newJButton("按鈕2");
//通過函數介面方式添加按鈕監聽器,Java8及以後版本支持
button2.addActionListener(e->{
JOptionPane.showMessageDialog(null,"我是按鈕2!");
});
this.add(button2);
}
publicstaticvoidmain(String[]args){
newDemo10().setVisible(true);
}
}
運行結果:
8. 在Java Swing GUI中,要點擊按鈕彈出類似於上傳文件的那個對話框,事件代碼該怎麼寫謝謝!
String path = null;
JFileChooser fc = new JFileChooser();
fc.setDialogTitle("請選擇要上傳的文件...");
fc.setApproveButtonText("確定");
fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
if (JFileChooser.APPROVE_OPTION == fc.showOpenDialog(this)) {
path=fc.getSelectedFile().getPath();
}
最後path 中的值就是選中的那個文件的路徑,然後就是IO操作了。
那個this一般版是指當前權Frame或Panel,傳入一個Component也可以