虚心求教求教鼠标响应的问题(急)

SHY1977 2004-10-22 11:17:05
以下是我改动过的SUN的JTabbedPane应用示例,现在我想在在panel1
中添加鼠标响应,请问该如何做,如果想将panel1用package的方式独立出来又需要注意什么?
请不吝赐教,谢谢.

/*
* TabbedPaneDemo.java is a 1.4 example that requires one additional

file:
* images/middle.gif.
*/
package TabbedPane;
import javax.swing.JTabbedPane;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JComponent;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.KeyEvent;

public class TabbedPaneDemo extends JPanel {
public TabbedPaneDemo() {
super(new GridLayout(1, 1));

JTabbedPane tabbedPane = new JTabbedPane();
ImageIcon icon = createImageIcon("images/middle.gif");

JPanel panel1 = new JPanel();
tabbedPane.addTab("Tab 1", icon, panel1,
"Does nothing");
tabbedPane.setMnemonicAt(0, KeyEvent.VK_1);

JPanel panel2 = new JPanel();
tabbedPane.addTab("Tab 2", icon, panel2,
"Does twice as much nothing");
tabbedPane.setMnemonicAt(1, KeyEvent.VK_2);

JPanel panel3 = new JPanel();
tabbedPane.addTab("Tab 3", icon, panel3,
"Still does nothing");
panel3.setPreferredSize(new Dimension(700, 500));
tabbedPane.setMnemonicAt(2, KeyEvent.VK_3);

JPanel panel4 = new JPanel();
panel4.setPreferredSize(new Dimension(410, 50));
tabbedPane.addTab("Tab 4", icon, panel4,
"Does nothing at all");
tabbedPane.setMnemonicAt(3, KeyEvent.VK_4);

//Add the tabbed pane to this panel.
add(tabbedPane);

//Uncomment the following line to use scrolling tabs.
//tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
}


/** Returns an ImageIcon, or null if the path was invalid. */
protected static ImageIcon createImageIcon(String path) {
java.net.URL imgURL = TabbedPaneDemo.class.getResource(path);
if (imgURL != null) {
return new ImageIcon(imgURL);
} else {
System.err.println("Couldn't find file: " + path);
return null;
}
}

/**
* Create the GUI and show it. For thread safety,
* this method should be invoked from the
* event-dispatching thread.
*/
private static void createAndShowGUI() {
//Make sure we have nice window decorations.
//JFrame.setDefaultLookAndFeelDecorated(true);

//Create and set up the window.
JFrame frame = new JFrame("TabbedPaneDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//Create and set up the content pane.
JComponent newContentPane = new TabbedPaneDemo();
newContentPane.setOpaque(true); //content panes must be opaque
frame.getContentPane().add(new TabbedPaneDemo(),
BorderLayout.CENTER);

//Display the window.
frame.pack();
frame.setVisible(true);
}

public static void main(String[] args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}


...全文
246 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
皮鲁 2004-10-29
  • 打赏
  • 举报
回复
要把事件处理独立出来也不难
==============================
package gui;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Frame1
extends JFrame {
JPanel contentPane;
BorderLayout borderLayout1 = new BorderLayout();
JTabbedPane jTabbedPane1 = new JTabbedPane();
JPanel jPanel1 = new JPanel();
JPanel jPanel2 = new JPanel();
JLabel jLabel1 = new JLabel();
JLabel jLabel2 = new JLabel();

//Construct the frame
public Frame1() {
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
try {
jbInit();
}
catch (Exception e) {
e.printStackTrace();
}
}

//Component initialization
private void jbInit() throws Exception {
contentPane = (JPanel)this.getContentPane();
contentPane.setLayout(borderLayout1);
this.setSize(new Dimension(400, 300));
this.setTitle("Frame Title");
jLabel1.setText("jLabel1");
jLabel2.setText("jLabel2");

// 自己写事件处理方法【宿主,托管机制】
jPanel1.addMouseListener(new JPanelMouseAdapter(this));
jPanel2.addMouseMotionListener(new JPanelMouseAdapter(this));

contentPane.add(jTabbedPane1, BorderLayout.CENTER);
jTabbedPane1.add(jPanel1, "jPanel1");
jPanel1.add(jLabel1, null);
jTabbedPane1.add(jPanel2, "jPanel2");
jPanel2.add(jLabel2, null);
}

//Overridden so we can exit when window is closed
protected void processWindowEvent(WindowEvent e) {
super.processWindowEvent(e);
if (e.getID() == WindowEvent.WINDOW_CLOSING) {
System.exit(0);
}
}

void jPanel_mouseClicked(MouseEvent e) {
jLabel1.setText(e.getX() + "||" + e.getY());
}

void jPanel_mouseMoved(MouseEvent e) {
jLabel2.setText(e.getX() + "+" + e.getY());
}
}


class JPanelMouseAdapter
implements java.awt.event.MouseListener, java.awt.event.MouseMotionListener {
Frame1 adaptee;

JPanelMouseAdapter(Frame1 adaptee) {
this.adaptee = adaptee;
}

public void mouseClicked(MouseEvent e) {
adaptee.jPanel_mouseClicked(e);
}

public void mousePressed(MouseEvent e) {

}

public void mouseReleased(MouseEvent e) {

}

public void mouseEntered(MouseEvent e) {

}

public void mouseExited(MouseEvent e) {

}

public void mouseDragged(MouseEvent e) {

}

public void mouseMoved(MouseEvent e) {
adaptee.jPanel_mouseMoved(e);
}

}

///////////////////////////////////////////////

以上JPanel事件处理类实现了两个接口,你需要处理什么类型的鼠标事件在对应的函数中写调用宿主的方法的就可以了。
febchen 2004-10-29
  • 打赏
  • 举报
回复
算了,避免麻烦,还是全贴给你把

/*
* TabbedPaneDemo.java is a 1.4 example that requires one additional

file:
* images/middle.gif.
*/
//package TabbedPane;
import javax.swing.JTabbedPane;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JComponent;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.KeyEvent;
import java.awt.event.*;

public class TabbedPaneDemo extends JPanel implements MouseListener{

JTabbedPane tabbedPane;
JPanel panel1,panel2,panel3,panel4;


public TabbedPaneDemo() {
super(new GridLayout(1, 1));

tabbedPane = new JTabbedPane();
ImageIcon icon = createImageIcon("images/middle.gif");

panel1 = new JPanel();
tabbedPane.addTab("Tab 1", icon, panel1,
"Does nothing");
tabbedPane.setMnemonicAt(0, KeyEvent.VK_1);

panel2 = new JPanel();
tabbedPane.addTab("Tab 2", icon, panel2,
"Does twice as much nothing");
tabbedPane.setMnemonicAt(1, KeyEvent.VK_2);

panel3 = new JPanel();
tabbedPane.addTab("Tab 3", icon, panel3,
"Still does nothing");
panel3.setPreferredSize(new Dimension(700, 500));
tabbedPane.setMnemonicAt(2, KeyEvent.VK_3);

panel4 = new JPanel();
panel4.setPreferredSize(new Dimension(410, 50));
tabbedPane.addTab("Tab 4", icon, panel4,
"Does nothing at all");
tabbedPane.setMnemonicAt(3, KeyEvent.VK_4);

//Add the tabbed pane to this panel.
tabbedPane.addMouseListener(this);
add(tabbedPane);

//Uncomment the following line to use scrolling tabs.
//tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
}

public void mouseClicked(MouseEvent e) {

if(tabbedPane.getSelectedComponent().equals(panel1)){
System.out.println("p1");
}
if(tabbedPane.getSelectedComponent().equals(panel2)){
System.out.println("p2");
}
if(tabbedPane.getSelectedComponent().equals(panel3)){
System.out.println("p3");
}
if(tabbedPane.getSelectedComponent().equals(panel4)){
System.out.println("p4");
}

}

public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}




/** Returns an ImageIcon, or null if the path was invalid. */
protected static ImageIcon createImageIcon(String path) {
java.net.URL imgURL = TabbedPaneDemo.class.getResource(path);
if (imgURL != null) {
return new ImageIcon(imgURL);
} else {
System.err.println("Couldn't find file: " + path);
return null;
}
}

/**
* Create the GUI and show it. For thread safety,
* this method should be invoked from the
* event-dispatching thread.
*/
private static void createAndShowGUI() {
//Make sure we have nice window decorations.
//JFrame.setDefaultLookAndFeelDecorated(true);

//Create and set up the window.
JFrame frame = new JFrame("TabbedPaneDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//Create and set up the content pane.
JComponent newContentPane = new TabbedPaneDemo();
newContentPane.setOpaque(true); //content panes must be opaque
frame.getContentPane().add(new TabbedPaneDemo(),
BorderLayout.CENTER);

//Display the window.
frame.pack();
frame.setVisible(true);
}

public static void main(String[] args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
febchen 2004-10-29
  • 打赏
  • 举报
回复
楼主:
因文件长没有全部拷贝,也请你看清代码再编译好么
我肯定编译并且运行通过的

再说一遍

1、要实现mouselistener接口
即public class TabbedPaneDemo extends JPanel implements MouseListener {
不实现MouseListener当然出错
TabbedPaneDemo.java:47: addMouseListener(java.awt.event.MouseListener) in java.a
wt.Component cannot be applied to (TabbedPaneDemo)
tabbedPane.addMouseListener(this);
^
1 error

2、将JTabbedPane tabbedPane; JPanel panel1,panel2,panel3,panel4;作为属性
而不是象原来那样定义在构造方法里
如下:
public class TabbedPaneDemo extends JPanel implements MouseListener {
JTabbedPane tabbedPane;
JPanel panel1,panel2,panel3,panel4;
public TabbedPaneDemo() {
}

这样就不会出现
TabbedPaneDemo.java:69: cannot resolve symbol
symbol : variable panel1
location: class TabbedPaneDemo
if(tabbedPane.getSelectedComponent().equals(panel1)){
等错误了


eddygtimegod 2004-10-29
  • 打赏
  • 举报
回复
JTabbedPane的继承关系是Component->JComponent->JTabbedPane,mouselistener响应Component层??
ok,算我脾气不好,或者就当我水平不够,以后你的问题我绝对不参与。
wanghuayang 2004-10-29
  • 打赏
  • 举报
回复
厉害,初学就搞了这么长了。
SHY1977 2004-10-29
  • 打赏
  • 举报
回复
感谢诸位不吝赐教,小弟初学JFC,贻笑大方之处还请海涵.谢谢诸位的参与.
SHY1977 2004-10-28
  • 打赏
  • 举报
回复
E:\Myjava>javac TabbedPaneDemo.java
TabbedPaneDemo.java:47: addMouseListener(java.awt.event.MouseListener) in java.a
wt.Component cannot be applied to (TabbedPaneDemo)
tabbedPane.addMouseListener(this);
^
1 error

E:\Myjava>_
E:\Myjava>javac TabbedPaneDemo.java
TabbedPaneDemo.java:69: cannot resolve symbol
symbol : variable panel1
location: class TabbedPaneDemo
if(tabbedPane.getSelectedComponent().equals(panel1)){
^
TabbedPaneDemo.java:69: cannot resolve symbol
symbol : variable tabbedPane
location: class TabbedPaneDemo
if(tabbedPane.getSelectedComponent().equals(panel1)){
^
TabbedPaneDemo.java:72: cannot resolve symbol
symbol : variable panel2
location: class TabbedPaneDemo
if(tabbedPane.getSelectedComponent().equals(panel2)){
^
TabbedPaneDemo.java:72: cannot resolve symbol
symbol : variable tabbedPane
location: class TabbedPaneDemo
if(tabbedPane.getSelectedComponent().equals(panel2)){
^
TabbedPaneDemo.java:75: cannot resolve symbol
symbol : variable panel3
location: class TabbedPaneDemo
if(tabbedPane.getSelectedComponent().equals(panel3)){
^
TabbedPaneDemo.java:75: cannot resolve symbol
symbol : variable tabbedPane
location: class TabbedPaneDemo
if(tabbedPane.getSelectedComponent().equals(panel3)){
^
TabbedPaneDemo.java:78: cannot resolve symbol
symbol : variable panel4
location: class TabbedPaneDemo
if(tabbedPane.getSelectedComponent().equals(panel4)){
^
TabbedPaneDemo.java:78: cannot resolve symbol
symbol : variable tabbedPane
location: class TabbedPaneDemo
if(tabbedPane.getSelectedComponent().equals(panel4)){
^
8 errors

E:\Myjava>_
=======================================
再次感谢大家的参与,希望大家能先编译一下最前面的代码再来解答.
JTabbedPane的继承关系是Component->JComponent->JTabbedPane,mouselistener响应Component层.因为java是类单继承、接口多继承的语言,所以上面的所有修改都无效.
我想实现的具体鼠标响应是在 panel1,panel2,panel3,panel4上用鼠标进行简单的图形绘制,并且当单击标签改变显示状态时,已绘制图形保持相对位置及大小不变.
eddygtimegod 2004-10-28
  • 打赏
  • 举报
回复
哈哈~~楼主的心也挺虚的吧,原本今晚想写代码给你的,不过楼上已经写了,看来楼主要看看鼠标事件的处理,其实楼上各位都写了,只不过没写输出而已。
febchen 2004-10-28
  • 打赏
  • 举报
回复
不知道你需要何种响应

我做如下改动:
1、
实现mouselistener接口
将JTabbedPane tabbedPane; JPanel panel1,panel2,panel3,panel4;作为属性
如下:
public class TabbedPaneDemo extends JPanel implements MouseListener {
JTabbedPane tabbedPane;
JPanel panel1,panel2,panel3,panel4;
public TabbedPaneDemo() {
super(new GridLayout(1, 1));

tabbedPane = new JTabbedPane();
ImageIcon icon = createImageIcon("images/middle.gif");

panel1 = new JPanel();
tabbedPane.addTab("Tab 1", icon, panel1,
"Does nothing");
tabbedPane.setMnemonicAt(0, KeyEvent.VK_1);
。。。。。。
tabbedPane.addMouseListener(this);
add(tabbedPane);
}

2、
实现接口方法,处理方法如下:
public void mouseClicked(MouseEvent e) {

if(tabbedPane.getSelectedComponent().equals(panel1)){
System.out.println("p1");
}
if(tabbedPane.getSelectedComponent().equals(panel2)){
System.out.println("p2");
}
if(tabbedPane.getSelectedComponent().equals(panel3)){
System.out.println("p3");
}
if(tabbedPane.getSelectedComponent().equals(panel4)){
System.out.println("p4");
}

}

public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}

这样可以区分四个panel,并进行相应处理,程序运行通过,能够响应鼠标事件,不知道是不是你的目标。
SHY1977 2004-10-28
  • 打赏
  • 举报
回复
谢谢楼上诸位的参与,可能 JTabbedPane诸位没有用过,它是JComponent的一个子类,无法象普通的容器一样添加鼠标响应.诸位的代码我试过了,可通过编译,却无运行效果.

请精通JFC的朋友给予帮助,不胜感激...
jackkui 2004-10-23
  • 打赏
  • 举报
回复
一个是 enrico(初学者)的方法,再就是使用内部类.在你的TabbedPaneDemo内部声明鼠标处理的类
public class TabbedPaneDemo extends JPanel {
……
……
上面是你的代码
class MouseOperation implements MouseListener{
public void mouseClicked(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}

}
你还可以继承MouseAdapter,这个你只需要重载你需要的方法,不用全部重载,而上面的
即使你不需要也要全部把方法都实现了。
class MouseOperation extends MouseAdapter{
//你需要的方法可以是,上面5个方法中的任意几个,
}
上述两种处理方法只要选择其中一个就可以了。
}
iwenlong 2004-10-23
  • 打赏
  • 举报
回复
可以implements MouseAdapter
enrico 2004-10-22
  • 打赏
  • 举报
回复
public class TabbedPaneDemo extends JPanel implements MouseListener {
...
JPanel panel1 = new JPanel();
panel1.addMouseListener(this);
...

public void mouseClicked(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
}

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧