java web 怎么在jtable中添加按钮?

java web 怎么在jtable中添加按钮?,第1张

java web在jtable中添加按钮的示例如下:

import java.awt.BorderLayout

import java.awt.Color

import java.awt.Component

import java.awt.Dimension

import java.awt.event.MouseAdapter

import java.awt.event.MouseEvent

import java.io.File

import javax.swing.BorderFactory

import javax.swing.ImageIcon

import javax.swing.JButton

import javax.swing.JFrame

import javax.swing.JPanel

import javax.swing.JScrollPane

import javax.swing.JTable

import javax.swing.UIManager

import javax.swing.border.Border

import javax.swing.border.EmptyBorder

import javax.swing.table.AbstractTableModel

import javax.swing.table.TableCellRenderer

public class JTableButton extends JPanel {

 private JTable table

 private JScrollPane scrollPane

 private JButton[] buttons

 private String path = System.getProperty("user.dir") + File.separator

 + "images" + File.separator

 

 public JTableButton() {

  setBorder(BorderFactory.createLineBorder(Color.red, 1))

  init()

 }

 private void init() {

  String headName[] = { "Name", "age", "sex", "adress", "image" }

  

  buttons = new JButton[5]

  for(int i=0i<buttons.lengthi++){

   buttons[i] = new JButton(""+i)

  }

  Object obj[][] = {

    { "LiMing", 23, Boolean.TRUE, buttons[0],

      new ImageIcon(path + "icon.png") },

    { "ZhangSan", 25, Boolean.TRUE,buttons[1],

      new ImageIcon(path + "icon.png") },

    { "WangWu", 21, Boolean.FALSE, buttons[2],

      new ImageIcon(path + "icon.png") },

    { "LiSi", 28, Boolean.TRUE, buttons[3],

      new ImageIcon(path + "icon.png") },

    { "LuBo", 20, Boolean.FALSE, buttons[4],

      new ImageIcon(path + "icon.png") }, }

  

  table = new JTable(new MyTableModel(headName,obj))

  table.setDefaultRenderer(JButton.class, new ComboBoxCellRenderer())

  scrollPane = new JScrollPane(table)

  setLayout(new BorderLayout())

  add(scrollPane, BorderLayout.CENTER)

  addHandler()

 }

 private void addHandler(){

  //添加事件

  table.addMouseListener(new MouseAdapter(){

   public void mouseClicked(MouseEvent e) {

    System.out.println("table")

    int row = table.getSelectedRow()

    int column = table.getSelectedColumn()

    System.out.println("row="+row+":"+"column="+column)

    if(column==3){

     //处理button事件写在这里...

     System.out.println(((JButton)table.getValueAt(row, column)).getText())

    }

   }

  })

 }

 public static void main(String[] args) {

  JFrame frame = new JFrame()

  frame.add(new JTableButton())

  frame.setSize(new Dimension(800, 400))

  frame.setVisible(true)

  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)

 }

 class MyTableModel extends AbstractTableModel {

  private String headName[]

  private Object obj[][]

  

  public MyTableModel() {

   super()

  }

  

  public MyTableModel(String[] headName, Object[][] obj) {

   this()

   this.headName = headName

   this.obj = obj

  }

  public int getColumnCount() {

   return headName.length

  }

  public int getRowCount() {

   return obj.length

  }

  public Object getValueAt(int r, int c) {

   return obj[r][c]

  }

  public String getColumnName(int c) {

   return headName[c]

  }

  public Class<?> getColumnClass(int columnIndex) {

   return obj[0][columnIndex].getClass()

  }

  @Override

  public boolean isCellEditable(int rowIndex, int columnIndex) {

   if (columnIndex == 3 || columnIndex == 4) {

    return false

   }

   return true

  }

 }

}

class ComboBoxCellRenderer implements TableCellRenderer {

 public Component getTableCellRendererComponent(JTable table, Object value,

   boolean isSelected, boolean hasFocus, int row, int column) {

  JButton cmb = (JButton) value

  if (isSelected) {

   cmb.setForeground(table.getSelectionForeground())

   cmb.setBackground(table.getSelectionBackground())

  } else {

   cmb

     .setForeground((unselectedForeground != null) ? unselectedForeground

       : table.getForeground())

   cmb

     .setBackground((unselectedBackground != null) ? unselectedBackground

       : table.getBackground())

  }

  cmb.setFont(table.getFont())

  if (hasFocus) {

   cmb

     .setBorder(UIManager

       .getBorder("Table.focusCellHighlightBorder"))

   if (!isSelected && table.isCellEditable(row, column)) {

    Color col

    col = UIManager.getColor("Table.focusCellForeground")

    if (col != null) {

     cmb.setForeground(col)

    }

    col = UIManager.getColor("Table.focusCellBackground")

    if (col != null) {

     cmb.setBackground(col)

    }

   }

  } else {

   cmb.setBorder(noFocusBorder)

  }

  return cmb

 }

 protected static Border noFocusBorder = new EmptyBorder(1, 1, 1, 1)

 private Color unselectedForeground

 private Color unselectedBackground

}

那个Button是控件

你可以添加HTMLbutton控件,<input type="button" id="btn" value="button"/>

或者服务器控件

<asp:Button runat="server" ID="button5" OnClientClick="return DeleteCheck(this)" Text="Asp:button" />

或者你可以通过一些网页编辑软件DW,或者微软的visual studio在设计模式下直接拖到你想要的位置

下面是一些参考

asp.net之所以现在开发方便和快捷,关键是它有一组强大的控件库,包括web服务器控件,web用户控件,web自定义控件,html服务器控件和html控件等。这里我主要说说html控件、html服务器控件和web服务器控件的区别。

1、html控件:就是我们通常的说的html语言标记,这些语言标记在已往的静态页面和其他网页里存在,不能在服务器端控制的,只能在客户端通过javascript和vbscript等程序语言来控制。<input type="button" id="btn" value="button"/>

2、html服务器控件:其实就是html控件的基础上加上runat="server"所构成的控件.它们的注意区别是运行方式不同,html控件运行在客户端,而html服务器控件是运行在服务器端的。参考其他资料是这样说的: 当ASP.NET 网页执行时,会检查标注有无runat 属性,如果标注没有设定,那么Html标注就会被视为符串,并被送到字符串流等待送到客户端,客户端的浏览器会对其进行解释;如果Html标注有设定runat="server" 属性,Page 对象会将该控件放入控制器,服务器端的代码就能对其进行控制,等到控制执行完毕后再将Html服务器控件的执行结果转换成Html标注,然后当成字符串流发送到客户端进行解释<input id="Button" type="button" value="button" runat="server" />

3、web服务器控件:也称asp.net服务器控件,是Web Form编程的基本元素,也是asp.net所特有的。它会按照client的情况产生一个或者多个html控件,而不是直接描述html元素。如: <asp:Button ID="Button2" runat="server" Text="Button"/>那么它和html服务器控件有什么区别呢?参照其他网页的资料看法如下:

1)、Asp.net服务器控件提供更加统一的编程接口,如每个Asp.net服务器控件都有Text属性。

2)、隐藏客户端的不同,这样程序员可以把更多的精力放在业务上,而不用去考虑客户端的浏览器是ie还是firefox,或者是移动设备。

3)、Asp.net服务器控件可以保存状态到ViewState里,这样页面在从客户端回传到服务器端或者从服务器端下载到客户端的过程中都可以保存。

4)、事件处理模型不同,Html标注和Html服务器控件的事件处理都是在客户端的页面上,而Asp.net服务器控件则是在服务器上,举例来说:

<input id="Button4" type="button" value="button" runat="server"/>是Html服务器控件,此时我们点击此按钮,页面不会回传到服务器端,原因是我们没有为其定义鼠标点击事件。

<input id="Button4" type="button" value="button" runat="server" onserverclick="test" />我们为Html服务器控件添加了一个onserverclick事件,点击此按钮页面会发回服务器端,并执行test(object sender, EventArgs e)方法。

<asp:Button ID="Button2" runat="server" Text="Button" />是Asp.net服务器控件,并且我们没有为其定义click,但是我们点击时,页面也会发回到服务器端。

由此可见:Html标注和Html服务器控件的事件是由页面来触发的,而Asp.net服务器控件则是由页面把Form发回到服务器端,由服务器来处理。

4、下面我就结合我自己的测试来说明问题:

这段代码是我放在repeat中的模板里的:其中DeleteCheck是一个js脚本函数,注意是用于是否发送到服务器端的,这里就不展示脚本代码了。

<input runat="server" type="button" id="delete" value="Server button" />

<input type="button" onclick="return DeleteCheck(this)" id="Button1" value="Client button" />

<input runat="server" type="submit" onclick="return DeleteCheck(this)" id="Button2" value="Server submit" />

<input type="submit" onclick="return DeleteCheck(this)" id="Button3" value="Client submit" />

<button runat="server" id="button4" onclick="return DeleteCheck(this)" value="Button-Button">Button-Button</button>

<asp:Button runat="server" ID="button5" OnClientClick="return DeleteCheck(this)" Text="Asp:button" />

展现出来的html代码如下:

<input name="Data$ctl03$delete" type="button" id="Data_ctl03_delete" value="Server button" />

<input type="button" onclick="return DeleteCheck(this)" id="Button1" value="Client button" />

<input name="Data$ctl03$Button2" type="submit" id="Data_ctl03_Button2" onclick="return DeleteCheck(this)" value="Server submit" / >

<input ut type="submit" onclick="return DeleteCheck(this)" id="Button3" value="Client submit" />

<button id="Data_ctl03_button4" onclick="return DeleteCheck(this)" value="Button-Button">Button-Button</button>

<input type="submit" name="Data$ctl03$button5" value="Asp:button" onclick="return DeleteCheck(this)" id="Data_ctl03_button5" />

可以看出以下几点:

1、当控件属性中有runat="server"时,生成的html控件时name和id发生的变化(.net Framework)。

2、当asp:button服务器按钮通过生成的页面后转化成类型为submit类型的Client控件。

3、当控件是html控件时通过生成的页面和原来的html代码完全一样(理由上面已经说名)。

另外我还测试了把这段代码直接放到form标记中(不放到其他子标记中)如:

<input runat="server" type="button" id="delete" value="Server button" onserverclick="delete_ServerClick" />

<input type="button" onclick="return DeleteCheck(this)" id="Button1" value="Client button" />

<input runat="server" type="submit" onclick="return DeleteCheck(this)" id="Button2" value="Server submit" />

<input type="submit" onclick="return DeleteCheck(this)" id="Button3" value="Client submit" />

<button runat="server" id="button4" onclick="return DeleteCheck(this)" value="Button-Button">Button-Button</button>

<asp:Button runat="server" ID="button5" OnClientClick="return DeleteCheck(this)" Text="Asp:button" OnClick="button5_Click" />

<asp:LinkButton ID="LinkButton1" runat="server" OnClick="LinkButton1_Click">LinkButton</asp:LinkButton>直接放到form标记中生成的html代码

<script type="text/javascript">

<!--

var theForm = document.forms['form1']

if (!theForm) {

theForm = document.form1

}

function __doPostBack(eventTarget, eventArgument) {

i f (!theForm.onsubmit (theForm.onsubmit() != false)) {

theForm.__EVENTTARGET.value = eventTarget

theForm.__EVENTARGUMENT.value = eventArgument

theForm.submit()

}

}

// -->

</script>

<input language="javascript" onclick="__doPostBack('delete','')" name="delete" type="button" id="delete" value="Server button" />

<input type="button" onclick="return DeleteCheck(this)" id="Button1" value="Client button" />

<input name="Button2" type="submit" id="Button2" onclick="return DeleteCheck(this)" value="Server submit" />

<input type="submit" onclick="return DeleteCheck(this)" id="Button3" value="Client submit" />

<button id="button4" onclick="return DeleteCheck(this)" value="Button-Button">Button-Button</button>

<input type="submit" name="button5" value="Asp:button" onclick="return DeleteCheck(this)" id="button5" />

<a id="LinkButton1" href="javascript:__doPostBack('LinkButton1','')">LinkButton</a>

这里有可以看出几点:

1、当html服务器控件在服务器端添加了服务器事件后生成的代码变为:onclick="_doPostBack()",实际上是调用脚本把整个窗体提交到服务器(如果没有添件服务器事件而只是添加了runat="server"是不会发送到服务器端的)这里注意如果要在html服务器控件中添加一个客户端事件如上面的 <input runat="server" type="button" id="delete" value="Server button" onserverclick="delete_ServerClick" />变成 <input runat="server" type="button" id="delete" value="Server button" onclick="return DeleteCheck(this)" onserverclick="delete_ServerClick" />那样生成的html代码变成 <input language="javascript" onclick="return DeleteCheck(this) __doPostBack('delete','')" name="delete" type="button" id="delete" value="Server button" />提示有脚本错误原因是onclick事件执行了2个脚本且书写的格式不正确。onclick="return DeleteCheck(this);_doPostBack()"这样的话就只能执行第一个函数而第二个函数就不能执行了(return).如果用onclick="return DeleteCheck(this),_doPostback()"是指2个函数同时都要执行没有影响(相当于一条语句)。在我的一个项目中需要对于控件进行区分总结,我在网上找了找加上自己的实际测试总结如下:

asp.net之所以现在开发方便和快捷,关键是它有一组强大的控件库,包括web服务器控件,web用户控件,web自定义控件,html服务器控件和html控件等。这里我主要说说html控件、html服务器控件和web服务器控件的区别。

1、html控件:就是我们通常的说的html语言标记,这些语言标记在已往的静态页面和其他网页里存在,不能在服务器端控制的,只能在客户端通过javascript和vbscript等程序语言来控制。<input type="button" id="btn" value="button"/>

2、html服务器控件:其实就是html控件的基础上加上runat="server"所构成的控件.它们的注意区别是运行方式不同,html控件运行在客户端,而html服务器控件是运行在服务器端的。参考其他资料是这样说的: 当ASP.NET 网页执行时,会检查标注有无runat 属性,如果标注没有设定,那么Html标注就会被视为字符串,并被送到字符串流等待送到客户端,客户端的浏览器会对其进行解释;如果Html标注有设定runat="server" 属性,Page 对象会将该控件放入控制器,服务器端的代码就能对其进行控制,等到控制执行完毕后再将Html服务器控件的执行结果转换成Html标注,然后当成字符串流发送到客户端进行解释<input id="Button" type="button" value="button" runat="server" />

3、web服务器控件:也称asp.net服务器控件,是Web Form编程的基本元素,也是asp.net所特有的。它会按照client的情况产生一个或者多个html控件,而不是直接描述html元素。如: <asp:Button ID="Button2" runat="server" Text="Button"/>那么它和html服务器控件有什么区别呢?参照其他网页的资料看法如下:

1)、 Asp.net服务器控件提供更加统一的编程接口,如每个Asp.net服务器控件都有Text属性。

2)、 隐藏客户端的不同,这样程序员可以把更多的精力放在业务上,而不用去考虑客户端的浏览器是ie还是firefox,或者是移动设备。

3)、 Asp.net服务器控件可以保存状态到ViewState里,这样页面在从客户端回传到服务器端或者从服务器端下载到客户端的过程中都可以保存。

4)、 事件处理模型不同,Html标注和Html服务器控件的事件处理都是在客户端的页面上,而Asp.net服务器控件则是在服务器上,举例来说:

<input id="Button4" type="button" value="button" runat="server"/>是Html服务器控件,此时我们点击此按钮,页面不会回传到服务器端,原因是我们没有为其定义鼠标点击事件。

<input id="Button4" type="button" value="button" runat="server" onserverclick="test" />我们为Html服务器控件添加了一个onserverclick事件,点击此按钮页面会发回服务器端,并执行test(object sender, EventArgs e)方法。

<asp:Button ID="Button2" runat="server" Text="Button" />是Asp.net服务器控件,并且我们没有为其定义click,但是我们点击时,页面也会发回到服务器端。

由此可见:Html标注和Html服务器控件的事件是由页面来触发的,而Asp.net服务器控件则是由页面把Form发回到服务器端,由服务器来处理。

4、下面我就结合我自己的测试来说明问题:

这段代码是我放在repeat中的模板里的:其中DeleteCheck是一个js脚本函数,注意是用于是否发送到服务器端的,这里就不展示脚本代码了。

<input runat="server" type="button" id="delete" value="Server button" />

<input type="button" onclick="return DeleteCheck(this)" id="Button1" value="Client button" />

<input runat="server" type="submit" onclick="return DeleteCheck(this)" id="Button2" value="Server submit" />

<input type="submit" onclick="return DeleteCheck(this)" id="Button3" value="Client submit" />

<button runat="server" id="button4" onclick="return DeleteCheck(this)" value="Button-Button">Button-Button</button>

<asp:Button runat="server" ID="button5" OnClientClick="return DeleteCheck(this)" Text="Asp:button" />

展现出来的html代码如下:

<input name="Data$ctl03$delete" type="button" id="Data_ctl03_delete" value="Server button" />

<input type="button" onclick="return DeleteCheck(this)" id="Button1" value="Client button" />

<input name="Data$ctl03$Button2" type="submit" id="Data_ctl03_Button2" onclick="return DeleteCheck(this)" value="Server submit" / >

<input ut type="submit" onclick="return DeleteCheck(this)" id="Button3" value="Client submit" />

<button id="Data_ctl03_button4" onclick="return DeleteCheck(this)" value="Button-Button">Button-Button</button>

<input type="submit" name="Data$ctl03$button5" value="Asp:button" onclick="return DeleteCheck(this)" id="Data_ctl03_button5" />

可以看出以下几点:

1、当控件属性中有runat="server"时,生成的html控件时name和id发生的变化(.net Framework)。

2、当asp:button服务器按钮通过生成的页面后转化成类型为submit类型的Client控件。

3、当控件是html控件时通过生成的页面和原来的html代码完全一样(理由上面已经说名)。

另外我还测试了把这段代码直接放到form标记中(不放到其他子标记中)

如: <input runat="server" type="button" id="delete" value="Server button" onserverclick="delete_ServerClick" />

<input type="button" onclick="return DeleteCheck(this)" id="Button1" value="Client button" />

<input runat="server" type="submit" onclick="return DeleteCheck(this)" id="Button2" value="Server submit" />

<input type="submit" onclick="return DeleteCheck(this)" id="Button3" value="Client submit" />

<button runat="server" id="button4" onclick="return DeleteCheck(this)" value="Button-Button">Button-Button</button>

<asp:Button runat="server" ID="button5" OnClientClick="return DeleteCheck(this)" Text="Asp:button" OnClick="button5_Click" />

<asp:LinkButton ID="LinkButton1" runat="server" OnClick="LinkButton1_Click">LinkButton</asp:LinkButton>直接放到form标记中生成的html代码

<script type="text/javascript">

<!--

var theForm = document.forms['form1']

if (!theForm) {

theForm = document.form1

}

function __doPostBack(eventTarget, eventArgument) {

if (!theForm.onsubmit (theForm.onsubmit() != false)) {

theForm.__EVENTTARGET.value = eventTarget

theForm.__EVENTARGUMENT.value = eventArgument

theForm.submit()

}

}

// -->

</script>

<input language="javascript" onclick="__doPostBack('delete','')" name="delete" type="button" id="delete" value="Server button" />

<input type="button" onclick="return DeleteCheck(this)" id="Button1" value="Client button" />

<input name="Button2" type="submit" id="Button2" onclick="return DeleteCheck(this)" value="Server submit" />

<input type="submit" onclick="return DeleteCheck(this)" id="Button3" value="Client submit" />

<button id="button4" onclick="return DeleteCheck(this)" value="Button-Button">Button-Button</button>

<input type="submit" name="button5" value="Asp:button" onclick="return DeleteCheck(this)" id="button5" />

<a id="LinkButton1" href="javascript:__doPostBack('LinkButton1','')">LinkButton</a>

这里有可以看出几点:

1、当html服务器控件在服务器端添加了服务器事件后生成的代码变为:onclick="_doPostBack()",实际上是调用脚本把整个窗体提交到服务器(如果没有添件服务器事件而只是添加了runat="server"是不会发送到服务器端的)这里注意如果要在html服务器控件中添加一个客户端事件如上面的 <input runat="server" type="button" id="delete" value="Server button" onserverclick="delete_ServerClick" />

变成 <input runat="server" type="button" id="delete" value="Server button" onclick="return DeleteCheck(this)" onserverclick="delete_ServerClick" />

那样生成的html代码变成 <input language="javascript" onclick="return DeleteCheck(this) __doPostBack('delete','')" name="delete" type="button" id="delete" value="Server button" />提示有脚本错误原因是onclick事件执行了2个脚本且书写的格式不正确。onclick="return DeleteCheck(this);_doPostBack()"这样的话就只能执行第一个函数而第二个函数就不能执行了(return).如果用onclick="return DeleteCheck(this),_doPostback()"是指2个函数同时都要执行没有影响(相当于一条语句)。

2、asp:button中的onclientclick事件生成后就变成了onclick事件了,类型变成了type="submit".然而服务器事件的onclick我想是通过发送到服务器端执行的。

3、LinkButton不定义onclick事件,它会自动的生成下面代码发送到服务器端。 href="javascript:__doPostBack('LinkButton1',' ')"

4、asp:button中的onclientclick事件生成后就变成了onclick事件了,类型变成了type="submit".然而服务器事件的onclick我想是通过发送到服务器端执行的。


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存