java的JFrame能直接添加组件吗?为什么用内容面板添加组件?

java的JFrame能直接添加组件吗?为什么用内容面板添加组件?,第1张

早期的java版本. 需要先获得内容面板getContentPane,然后才能向JFram添加组件.

frame.getContentPane().add(child)

后来的java版本, 已经简化为可以直接向JFrame添加组件了.(实际上还是向内容面板进行了添加,只是代码上简洁了).

frame.add(child)

这些知识,你也可以通过阅读java源代码的注释里获得.

java源码里的描述

1.选择文件路径输出

package com.dao

import java.awt.FlowLayout

import java.awt.event.ActionEvent

import java.awt.event.ActionListener

import javax.swing.JButton

import javax.swing.JFileChooser

import javax.swing.JFrame

public class Win {

static JFrame f = new JFrame()

static JButton jb = new JButton("上传")

public void Show() {

jb.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

JFileChooser jfc = new JFileChooser()

if(jfc.showOpenDialog(f)==JFileChooser.APPROVE_OPTION ){

//解释下这里,d出个对话框,可以选择要上传的文件,如果选择了,就把选择的文件的绝对路径打印出来,有了绝对路径,通过JTextField的settext就能设置进去了,那个我没写

System.out.println(jfc.getSelectedFile().getAbsolutePath())

}

}

})

//这下面的不用在意 一些设置

f.add(jb)

f.setLayout(new FlowLayout())

f.setSize(480, 320)

// f.setDefaultCloseOperation(EXIT_ON_CLOSE)

f.setLocationRelativeTo(null)

f.setVisible(true)

}

public static void main(String[] args) {

// TODO Auto-generated method stub

new Win().Show()

}

}

2.选择文件夹路径在控制台输出

package com.dao

import javax.*

import javax.swing.*

import java.awt.*

import java.awt.event.ActionEvent//添加鼠标事件必备引用

import java.awt.event.ActionListener//添加鼠标事件必备引用

public class Test {

// extends JPanel implements ActionListener

static JFrame frame = new JFrame("")

static JPanel p = new JPanel()

JButton jb = new JButton("上传")

JFileChooser chooser

String choosertitle

public static void main(String s[]) {

new Test().Show()

}

public void Show() {

jb.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

int result

chooser = new JFileChooser()

chooser.setCurrentDirectory(new java.io.File("."))

chooser.setDialogTitle(choosertitle)

System.out.println("---"+choosertitle)

chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY)

chooser.setAcceptAllFileFilterUsed(false)

if (chooser.showOpenDialog(p) == JFileChooser.APPROVE_OPTION) {

System.out.println("getCurrentDirectory(): "

+ chooser.getCurrentDirectory())

System.out.println("getSelectedFile() : "

+ chooser.getSelectedFile())

} else {

System.out.println("No Selection ")

}

}

})

// frame.addWindowListener(new WindowAdapter() {

// public void windowClosing(WindowEvent e) {

//System.exit(0)

// }

// })

p.add(jb)

frame.add(p, "Center")

frame.setSize(320, 240)

frame.setVisible(true)

}

}

3.网上找的一些资料说明文件,没事看看。

JFileChooser

其实JFileChooser基本使用方法还是很简单的,下面写两个示例看了就明白了,如果还要增加一些功能,我们还可以添加过滤器,只显示过滤后的文件。还可以再保存的时候,如果保存的是目录里已经存在的文件,那么对话框不会关闭,并且d出一个JOptionPane提示用户是否保存文件。

打开文件对话框:

import java.io.File

import javax.swing.JFileChooser

import javax.swing.filechooser.FileFilter

public class FileChooserTest {

public static void main(String [] args) {

//首先是创建JFileChooser 对象,里面带个参数,表示默认打开的目录,这里是默认打开当前文件所在的目录。

JFileChooser file = new JFileChooser (".")

//下面这句是去掉显示所有文件这个过滤器。

file.setAcceptAllFileFilterUsed(false)

//添加excel文件的过滤器

file.addChoosableFileFilter(new ExcelFileFilter("xls"))

//添加exe文件的过滤器

file.addChoosableFileFilter(new ExcelFileFilter("exe"))

int result = file.showOpenDialog(null)

String fileName = file.getName()

int index = fileName.lastIndexOf('.')

if (index >0 &&index <fileName.length() - 1)

{

String extension = fileName.substring(index + 1).toLowerCase()

if (extension.equals(ext))

return true

}

return false

}

public String getDescription() {

if (ext.equals("xls"))

{

return "Microsoft Excel文件(*.xls)"

}

if(ext.equals("exe"))

{

return "可执行文件(*.exe)"

}

return ""

}

}

}

打开选择文件的对话框就建立好了。但是上面的程序还有瑕疵。因为只有当用户点取消或关闭该窗口时才不会执行任何 *** 作。而如果用户在对话框里输入的文件在当前目录中不存在时,那么窗口依然会关闭,这时可能就需要在程序中再来做判断。那么可不可以在当用户输入错误的文件名后,窗口不会关闭,而是不执行任何 *** 作或者d出个对话框提示用户,可以看看大多数window程序中的选择对话框都是这么做的,其实要实现这个功能也不难, 只需要再重写一下JFileChooser类的approveSelection()方法就行了。

我们将上面的程序做下修改,首先还是需要创建一个继承于JFileChooser的类,这个类可以写成外部或者内部类,我们这里依然写为内部类,注意,如果需要在静态方法中调用它,则需要将它设置为静态的。

private static class MyChooser extends JFileChooser {

MyChooser(String path) {

super(path)

}

public void approveSelection() {

File file = new File(getSelectedFile().getPath())

if (file.exists())

super.approveSelection()

else

JOptionPane.showMessageDialog(null, "你选择的文件不存在,请重新选择!")

}

把上面这段代码添加进刚才的类里面,然后把

JFileChooser file = new JFileChooser (".")改成

JFileChooser file = new MyChooser (".")

好了,现在我们就可以在不关闭该对话框的情况下判断用户的输入是否错误了。还可以加入正则表达式,判断用户输入是否符合规定, *** 作方式按照这个框架来写就没问题了。这里不再赘述。下面是保存对话框!

保存对话框:

其实保存对话框和打开文件对话框在使用上没什么区别,他们都是使用同一个类JFileChooser,因为在swing当中打开和保存对话框不会做出任何对文件进行处理的功能,所有的这些功能需要我们自己去实现,而仅仅是提供了1个这样的窗口模型而已。因此这两种窗口其实只是将按钮的标签进行了替换而已 。创建他们唯一的区别就是打开是调用showOpenDialog()方法,保存则是调用showSaveDialog(),创建形式几乎一样。我们在使用他们的时候就需要分别对这两种窗口的返回后进行不同的处理,设置过滤器是一样的,因此过滤器我们就复用上面打开文件窗口的方法,但是在判断输入保存文件是否在当前目录下时,我们需要做出不一样的处理。当用户输入了与当前目录相同的文件名后,要d出对话框询问用户是否需要覆盖原文件,如果用户选择否,那么返回保存文件的对话框允许用户继续选择或者输入保存的文件名。

下面我只需要修改上面代码的两个地方就能够达到目的。首先将修改一下MyChooser这个类

private static class MyChooser extends JFileChooser {

MyChooser(String path) {

super(path)

}

public void approveSelection() {

File file = this.getSelectedFile()

if (file.exists())

{

int copy = JOptionPane.showConfirmDialog(null,

"是否要覆盖当前文件?", "保存", JOptionPane.YES_NO_OPTION,

JOptionPane.QUESTION_MESSAGE)

if (copy == JOptionPane.YES_OPTION)

super.approveSelection()

}

else

super.approveSelection()

}

}

再把上面的

int result = file.showOpenDialog(null)

改成

int result = file.showSaveDialog(null)

两个基本的选择文件对话框就创建完成了。

如果需要多选,那么要设置setMultiSelectionEnabled(true)

那么File file = this.getSelectedFile()这句我们就要改成

File [] files = this.getSelectedFiles()

files这个数组里面就存放的是选择多个文件File对象,然后我们只需要对这个数组进行 *** 作即可。

正常情况, 我们添加组件都是使用 jframe.add(new JButton("ENTER"))或者 jframe.getContentPane().add(new JButton("ENTER"))上面两行代码其实是一样的, 只是版本较低的JDK,只支持第二种写法 这说明, 我们平时添加到窗口的组件


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11655090.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存