javax.swing.plaf.basic.BasicFileChooserUI.ApproveSelectionAction不可见

wtscrystal 发布于 2012/03/01 12:36
阅读 390
收藏 0

class MyPlaf extends javax.swing.plaf.basic.BasicFileChooserUI.ApproveSelectionAction

{

.................

}

问一下:为何出现:The type javax.swing.plaf.basic.BasicFileChooserUI.ApproveSelectionAction is not visible. 我用提eclipse   Version: 3.6.1, JDK 1.6

我发现这个类为:protected 嵌套类,大家有没有知道的?

加载中
0
w
wtscrystal
没有人知道吗?
0
canghailan
canghailan

你被迷惑了。。。看看这段代码就知道了:

public class MyUI extends javax.swing.plaf.basic.BasicFileChooserUI {
    public MyUI(JFileChooser b) {
        super(b);
    }

    class MyApproveSelectionAction extends ApproveSelectionAction {

    }
}

ApproveSelectionAction是protected的,所以只对BasicFileChooserUI的子类可见。你直接继承当然不行。

0
w
wtscrystal

那请问一下楼上的,下面这段代码该如何改呢:

import java.awt.event.ActionEvent;
import java.io.File;
import javax.swing.JFileChooser;
import javax.swing.plaf.basic.BasicFileChooserUI;


class qcqc extends javax.swing.plaf.basic.BasicFileChooserUI.ApproveSelectionAction     //这里报不可见
{

 private static final long serialVersionUID = 0x7c7de1140739bbc3L;
 final pcpc a;
 JFileChooser JF;

 protected qcqc(javax.swing.plaf.basic.BasicFileChooserUI pcPC)
 {
  super(pcPC);        //这里调用的是BasicFileChooserUI.ApproveSelectionAction的构造函数
                 
  a = pcPC;
 
  
 }

 public void actionPerformed(ActionEvent actionevent)
 {
 ......................
 
  if (a.isDirectorySelected())
  {
   a.b(file1);
   return;
  } else
  {
   super.actionPerformed(actionevent);   //这里也是调用BasicFileChooserUI.ApproveSelectionAction
                                                                     //但因为上面的不可见,这里也不能编译通过
   return;
  }
 }
}

 

改为:extends javax.swing.plaf.basic.BasicFileChooserUI 倒是可见,但下面的调用又不对了

不能直接继承,有没有别的办法呀,通过接口?

0
Monkey
Monkey

UI包里的类最好都不要去继承修改,swing的UI最好别去动,除非你是想自己去改变控件的UI显示,比如表格合并,圆形按钮等。或者是创建一个全新的控件。BasicFileXXXUI这个是提供最基础的UI的类,也就是通常人认为swing很丑陋的那个UI。实际上运行往往都是各种平台的模拟UI。

你这种做法本来就不是很提倡,ApproveSelectionAction是BasicFileChooserUI子类才能使用。不知道你想做什么,如果你只是想知道JFileChooser选择文件那个事件的话,可以用addPropertyChangeListener来监听,这里几乎会拿到所有的事件,当然你也可以自己往里添加自己的事件,不过要去用PropertyChangeName去监听一个特定的事件属于自己关心的事件,否则事件过多就会卡死。

swing优良的框架就是寄托在事件上的,这也是她复杂的原因,很多时候都是非常隐蔽的,不熟悉的人就会觉得莫名其妙。



0
w
wtscrystal

引用来自“Monkey”的答案

UI包里的类最好都不要去继承修改,swing的UI最好别去动,除非你是想自己去改变控件的UI显示,比如表格合并,圆形按钮等。或者是创建一个全新的控件。BasicFileXXXUI这个是提供最基础的UI的类,也就是通常人认为swing很丑陋的那个UI。实际上运行往往都是各种平台的模拟UI。

你这种做法本来就不是很提倡,ApproveSelectionAction是BasicFileChooserUI子类才能使用。不知道你想做什么,如果你只是想知道JFileChooser选择文件那个事件的话,可以用addPropertyChangeListener来监听,这里几乎会拿到所有的事件,当然你也可以自己往里添加自己的事件,不过要去用PropertyChangeName去监听一个特定的事件属于自己关心的事件,否则事件过多就会卡死。

swing优良的框架就是寄托在事件上的,这也是她复杂的原因,很多时候都是非常隐蔽的,不熟悉的人就会觉得莫名其妙。



ApproveSelectionAction的确是BasicFileChooserUI这个类的子类,即嵌套类,但为protected,  里面也有public的,用起来都没有问题,就是这个protected的不好用,要如何才能用上呢?

 

0
Monkey
Monkey

引用来自“wtscrystal”的答案

引用来自“Monkey”的答案

UI包里的类最好都不要去继承修改,swing的UI最好别去动,除非你是想自己去改变控件的UI显示,比如表格合并,圆形按钮等。或者是创建一个全新的控件。BasicFileXXXUI这个是提供最基础的UI的类,也就是通常人认为swing很丑陋的那个UI。实际上运行往往都是各种平台的模拟UI。

你这种做法本来就不是很提倡,ApproveSelectionAction是BasicFileChooserUI子类才能使用。不知道你想做什么,如果你只是想知道JFileChooser选择文件那个事件的话,可以用addPropertyChangeListener来监听,这里几乎会拿到所有的事件,当然你也可以自己往里添加自己的事件,不过要去用PropertyChangeName去监听一个特定的事件属于自己关心的事件,否则事件过多就会卡死。

swing优良的框架就是寄托在事件上的,这也是她复杂的原因,很多时候都是非常隐蔽的,不熟悉的人就会觉得莫名其妙。



ApproveSelectionAction的确是BasicFileChooserUI这个类的子类,即嵌套类,但为protected,  里面也有public的,用起来都没有问题,就是这个protected的不好用,要如何才能用上呢?

 

你想干嘛,人家那么写的目的就是告诉你这个类只限制于在本类或者子类使用。如果没有static,protected和public效果一样,外部类无法使用。你说的里面有public类你一样无法使用。如果你非要用这个类,就去把他的源码抠出来用吧。
0
w
wtscrystal

回复楼上的,我前面给过的那个其实就是我抠出来的,但是没有法用:即以下代码:

import java.awt.event.ActionEvent;
import java.io.File;
import javax.swing.JFileChooser;
import javax.swing.plaf.basic.BasicFileChooserUI;


class qcqc extends javax.swing.plaf.basic.BasicFileChooserUI.ApproveSelectionAction     //这里报不可见
{

 private static final long serialVersionUID = 0x7c7de1140739bbc3L;
 final pcpc a;
 JFileChooser JF;

 protected qcqc(javax.swing.plaf.basic.BasicFileChooserUI pcPC)
 {
  super(pcPC);        //这里调用的是BasicFileChooserUI.ApproveSelectionAction的构造函数
                 
  a = pcPC;
 
  
 }

 public void actionPerformed(ActionEvent actionevent)
 {
 ......................
 
  if (a.isDirectorySelected())
  {
   a.b(file1);
   return;
  } else
  {
   super.actionPerformed(actionevent);   //这里也是调用BasicFileChooserUI.ApproveSelectionAction
                                                                     //但因为上面的不可见,这里也不能编译通过
   return;
  }
 }
}

 

我就是想知道别人是如何做到呢?关键在这里!!!!!!!!!!!

0
canghailan
canghailan
Monkey说的相当有道理,为什么要从这里入手实现呢?
我就是想知道别人是如何做到呢?关键在这里!!!!!!!!!!!
做到了什么?能贴出来看看么?
0
w
wtscrystal

引用来自“canghailan”的答案

Monkey说的相当有道理,为什么要从这里入手实现呢?
我就是想知道别人是如何做到呢?关键在这里!!!!!!!!!!!
做到了什么?能贴出来看看么?

反汇编结果显示,qcqc的superclass 为:javax.swing.plaf.basic.BasicFileChooserUI$ApproveSelectionAction     注意用的是 $ ,当然在源码里只能用"."了.      那表示: qcqc  extends javax.swing.plaf.basic.BasicFileChooserUI.ApproveSelectionAction    

canghailan
canghailan
呵呵,想不出来为什么。。。这个类名这么诡异,不会是被混淆过的吧,有没有可能是由BasicFileChooserUI子类的内部类混淆出来的呢?
0
w
wtscrystal

引用来自“wtscrystal”的答案

引用来自“canghailan”的答案

Monkey说的相当有道理,为什么要从这里入手实现呢?
我就是想知道别人是如何做到呢?关键在这里!!!!!!!!!!!
做到了什么?能贴出来看看么?

反汇编结果显示,qcqc的superclass 为:javax.swing.plaf.basic.BasicFileChooserUI$ApproveSelectionAction     注意用的是 $ ,当然在源码里只能用"."了.      那表示: qcqc  extends javax.swing.plaf.basic.BasicFileChooserUI.ApproveSelectionAction    

类名是什么本身并不重要(是我胡乱写的一个名而已),关键是父类如何继承。因为同样包中有别的类也继承BasicFileChooserUI类中的嵌套的public类,没有问题的

返回顶部
顶部