随笔 - 6  文章 - 1  trackbacks - 0
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

常用链接

留言簿(1)

随笔档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜

typeTable.setPreferredScrollableViewportSize(typeTable.getPreferredSize());
JScrollPane typeTableScrollPane
=new JScrollPane(typeTable);

mt.pack();
mt.setVisible(
true);
import java.awt.*;

import javax.swing.*;

public class MixerTest2 extends JFrame {

public MixerTest2() {
super("Customer Editor Test");
setSize(
600,160);
setDefaultCloseOperation(EXIT_ON_CLOSE);

JTable typeTable
=new JTable();
typeTable
=new JTable(new String [][] {
{"312fs""33232""32""32"},
{"3212fsdfa12""3322""32""32"},
{"3212fa12""321212""321212""321212"},
{"3212gsds12""321212""321212""321212"}
}
,
new String [] {
"Title 1""Title 2""Title 3""Title 4"
}

);
typeTable.setAutoResizeMode(JTable.AUTO_RESIZE_NEXT_COLUMN);

typeTable.getColumnModel().getColumn(
0).setPreferredWidth(10);
typeTable.getColumnModel().getColumn(
1).setPreferredWidth(30);
JScrollPane typeTableScrollPane
=new JScrollPane(typeTable);

getContentPane().add(typeTableScrollPane);
}


public static void main(String args[]) {
MixerTest2 mt 
= new MixerTest2();
mt.setVisible(
true);
}

}

在上面的代码中,我打算在JTable初始化的过程中,调用typeTable.getColumnModel().getColumn(0).setPreferredWidth(10);初始化各列的宽度。
但实际的情况是,只有我将初始值设为大于75时,该命令才会成功,否则就是各列均等。
原因:
没有具体指定宽度的列,JTable会默认的设置为75。
JTable 的宽度=10+30+75+75=190 
而在我的这个样例程序中,JFrame 宽度为600,远远大于JTable 的宽度。因此程序按照我的初始值绘制完JTable之后,会自动的根据JFrame 的大小及布局再重新调整。这样就造成与代码不符的情况。
在网上查询到,有人推荐使用Table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);这样会解决问题,但同时我们也失去使用AutoResizeMode的好处。
将代码修改如下,问题解决:
typeTable.setPreferredScrollableViewportSize(typeTable.getPreferredSize());
JScrollPane typeTableScrollPane
=new JScrollPane(typeTable);

mt.pack();
mt.setVisible(
true);





posted @ 2008-12-12 14:06 川流不息 阅读(2300) | 评论 (0)编辑 收藏

使用命令重新设置JPanel的布局。
1)在JPanel上添加或者删除组件;
2)完成布局;
3)调用 validate();使新布局有效。

posted @ 2008-12-12 13:43 川流不息 阅读(296) | 评论 (0)编辑 收藏

Look And Feel for NetBeans

此帖讨论NetBeans的非默认样式的用法,基于命令行。
这里笔者将“laf(Look And Feel)”译为“样式”

因为NetBeans是基于Swing的,这使得NetBeans具有了百变面孔,相当可爱哟!

了解Java Swing 的人可能知道Swing 的Look and Feel 是很灵活的,现在就有很多的实现。下面是笔者知道的windows平台的一些列表:
其中前四种是jdk自带的,后三种比较有趣。(因为笔者还没有申请到opensolaris,只知道windows,渴望中)。
注意今天的实现方式是跨平台的。

打开这个路径C:\Program Files\netbeans-5.5\bin,检查是否有nb.exe
打开命令行输入cd "C:\Program Files\netbeans-5.5\bin"回车
输入nb --laf javax.swing.plaf.metal.MetalLookAndFeel
这样NetBeans就打开了,其样式与原来的有什么不同?下面是笔者的图片
命令行:

NetBeans:


用这种方法可以顺利的看到前四种的结果,其中第3种是windows下NetBeans默认的样式。
而对于其它三种则没有效果,因为根本就没有找到那些类。
输出窗口报错如下:
UI class not found, using default UI...

现在介绍其它三种效果的实现方法。
首先,需要获得它们的jar包,你可能已发现我在上面给这三种样式加了链接,点进去下载吧
下面以substance为例,这儿下它的包
https://substance.dev.java.net/files/documents/3294/55844/substance.jar
放到D:\下
打开命令行输入cd "C:\Program Files\netbeans-5.5\bin"回车
输入nb --cp:a "D:\substance.jar" --laf org.jvnet.substance.SubstanceLookAndFeel
这样NetBeans就打开了,其样式与原来的有什么不同?下面是笔者的图片



---------------------------------------------------------------------------------------------------------------------------------------------------------------

每次都在命令行中启动,过于繁琐。可以在NETBEAN 的配置文件中加入配置参数:
1)下载 look and feel jar 包到硬盘上
2)打开netbean安装路径下的etc\netbeans.conf
       增加下面一下行:
       netbeans_default_options="--cp:p C:\javaplugin\PgsLookAndFeel.jar --laf com.pagosoft.plaf.PgsLookAndFeel"
       --cp:p C:\javaplugin\PgsLookAndFeel.jar 作用是把look and feel jar 加到Netbean启动路径上;
       --laf com.pagosoft.plaf.PgsLookAndFeel  作用为启用指定的look and feel。
posted @ 2008-11-14 11:52 川流不息 阅读(1668) | 评论 (0)编辑 收藏
数据库为 JavaFee.mdb 存放在DATA 目录下,密码为:1234.
连接语句如下
try {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            String path=System.getProperty("user.dir");
            String strurl = "jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ="+path+"\\Data\\JavaFee.mdb;pwd="+"1234"+";";
            try {
                con = DriverManager.getConnection(strurl);
            } catch (SQLException ex) {
                JOptionPane.showMessageDialog(MoneyControlView.this, "数据库文件丢失,请检查!", "数据检查", JOptionPane.ERROR_MESSAGE);
            }
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(MoneyControlView.class.getName()).log(Level.SEVERE, null, ex);
        }
posted @ 2008-10-02 03:07 川流不息 阅读(719) | 评论 (0)编辑 收藏
最近在做一个小数据库程序,数据库选用ACCESS。
在ACCESS中建表 feeDetail
 
字段   描述
ID
fee
description
type
date 记录插入日期

程序中SQL 语句:insert into DailyFee(fee,description,type,date) values (?,?,?,?);
运行却总是提示语法错误,很奇怪,找不出原因。
在网上狂搜一下,才发现原来ACCESS不允许 采用关键字DATE作为字段名,修改字段名,运行,成功。
posted @ 2008-09-22 11:07 川流不息 阅读(354) | 评论 (0)编辑 收藏
 简单来说:

TableCellRenderer就是用来绘制展示当前cell单元数值内容的,你可以用文字、数值或者图片来表示内容,当然最强大展示方式的就是通过自定义自己的renderer组件,通过Java2D来绘制各种天花乱坠的效果。


TableCellEditor主要是用来当用户点击在具体cell时进行编辑的组件,所以TableCellEditor除了具有TableCellRenderer一样的绘制功能外还可以进行交互动作,例如在cell上出现下拉框、勾选框甚至通过按钮弹出更复杂的对话框让用户进行输入编辑。


以下是在cell中嵌入start、stop两个按钮的表格,注意这里的renderer只是用来显示效果,并没有进行交互动作,真正进行动作的是当你将鼠标点击在cell上时,JTable定位上去的editor,所以不要徒劳在renderer上做点击事项处理,renderer是不会接受到交互事项的,renderer只是个画笔,你看到的start、stop按钮只是这个画笔画出来的内容,是虚的并没有真正的组件在上面。


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
public class TableTest1 extends JFrame {
 JTable table;
 String[] states = new String[]{"stop", "stop", "stop"};
 
 // model
 class TableModel extends AbstractTableModel{
  public int getColumnCount() {
   return 2;
  }
  public int getRowCount() {
   return states.length;
  }
  public Object getValueAt(int rowIndex, int columnIndex) {
   if(columnIndex == 0){
    return states[rowIndex];
   }
   return null;
  }
     public String getColumnName(int columnIndex) {
   if(columnIndex == 0){
    return "state";
   }else{
    return "operate";
   }
     }
     public boolean isCellEditable(int rowIndex, int columnIndex) {
   if(columnIndex == 0){
    return false;
   }else{
    return true;
   }
     }
 }
 
 // cell editor
 class Editor extends AbstractCellEditor implements TableCellEditor, ActionListener {
  int row;
  JTable table;
  JPanel panel;
  JButton start;
  JButton stop;
  Editor(){
   panel = new JPanel();
   panel.setLayout(new GridLayout(1, 2));
   start = new JButton("start");
   stop = new JButton("stop");
   start.addActionListener(this);
   stop.addActionListener(this);
   panel.add(start);
   panel.add(stop);
  }
     public Object getCellEditorValue() {
         return null;
     }
     public Component getTableCellEditorComponent(JTable table,
                                                  Object value,
                                                  boolean isSelected,
                                                  int row,
                                                  int column) {
      this.table = table;
      this.row = row;
      return panel;
     }
    
  public void actionPerformed(ActionEvent e) {
   if(e.getSource() == start){
    states[row] = "start";
   }else{
    states[row] = "stop";
   }
   ((AbstractTableModel)table.getModel()).fireTableCellUpdated(row, 0);
  }
 
 }
 
 // cell render
 class Renderer extends JComponent implements TableCellRenderer{
  JPanel panel;
  JButton start;
  JButton stop;
  Renderer(){
   panel = new JPanel();
   panel.setLayout(new GridLayout(1, 2));
   start = new JButton("start");
   stop = new JButton("stop");
   panel.add(start);
   panel.add(stop);
  }
  public Component getTableCellRendererComponent(JTable table, Object value,
    boolean isSelected, boolean hasFocus, int row, int column) {
   return panel;
  }
 }
 
 public TableTest1(){
  super("renderer and editor self-existent");
  table = new JTable(new TableModel());
  TableColumn tableColumn = table.getColumnModel().getColumn(1);
  tableColumn.setCellRenderer(new Renderer());
  tableColumn.setCellEditor(new Editor());
 
        this.getContentPane().setLayout(new BorderLayout());
        this.getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
        this.setSize(500, 300);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 }
 public static void main(String[] args) {
  new TableTest1().show();
 }
}

posted @ 2008-07-25 23:56 川流不息 阅读(1777) | 评论 (1)编辑 收藏
仅列出标题