JTable demo

 

简单讲就是在没有使用layout manager的时候用setSize,在使用了layout manager 的时候用setPreferredSize
 
并且setPreferredSize通常和setMinimumSize、setMaximumSize联系起来使用
setSize()是你手动来设置组件的大小
Dimension 类封装单个对象中组件的宽度和高度(精确到整数)。该类与组件的某个属性关联。由 Component 类和 LayoutManager 接口定义的一些方法将返回 Dimension 对象
setPreferredSize设置此组件的首选大小
一般会用setPreferredSize 

http://www.cnblogs.com/langtianya/archive/2012/10/13/2722904.html

 

// in constructor
rowSM_treatments = table_histories.getSelectionModel();
rowSM_treatments.addListSelectionListener(new ListSelectionListener() {public void valueChanged(ListSelectionEvent e) {if (e.getValueIsAdjusting()) return;ListSelectionModel lsm = (ListSelectionModel)e.getSource();if (lsm.isSelectionEmpty()) {System.out.println("No rows are selected.");} else {selectedRow_treatments = lsm.getMinSelectionIndex();System.out.println("selected Row> " + selectedRow_treatments);//do more}}});

 

table.changeSelection(row, 0, false, false);

import javax.swing.JTable;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;public class SelectionListener implements ListSelectionListener {JTable table;SelectionListener(JTable table) {this.table = table;}public void valueChanged(ListSelectionEvent e) {if (e.getSource() == table.getColumnModel().getSelectionModel() && table.getColumnSelectionAllowed()) {int firstRow = e.getFirstIndex();int lastRow = e.getLastIndex();// 事件处理...
        }}}

 

 intgetFirstIndex()
          Returns the index of the first row whose selection may have changed.
 intgetLastIndex()
          Returns the index of the last row whose selection may have changed.
 booleangetValueIsAdjusting()
          Returns whether or not this is one in a series of multiple events, where changes are still being made.
 StringtoString()
          Returns a String that displays and identifies this object's properties.

  

package swing.table;import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.util.Date;import javax.swing.AbstractAction;
import javax.swing.DefaultListSelectionModel;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.KeyStroke;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;public class SelectionModeDemo {String[] headings = { "Name", "Customer ID", "Order #", "Status" };Object[][] data = {{ "A", new Integer(3), "0", new Date() },{ "B", new Integer(6), "4", new Date() },{ "C", new Integer(9), "9", new Date() },{ "D", new Integer(7), "1", new Date() },{ "E", new Integer(4), "1", new Date() },{ "F", new Integer(8), "2", new Date() },{ "G", new Integer(6), "1", new Date() }};JTable jtabOrders = new JTable(data, headings);SelectionModeDemo() {final JFrame jfrm = new JFrame("JTable Demo");jfrm.setLayout(new FlowLayout());jfrm.setSize(800, 600);jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);JScrollPane jscrlp = new JScrollPane(jtabOrders);jfrm.add(jscrlp);jtabOrders.setPreferredScrollableViewportSize(new Dimension(420, 200));// 设置选择模式。以下列表描述了接受的选择模式:只能选择一行!
        jtabOrders.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);// 拦截Ctrl+A组合键,防止焦点丢失// new event create.KeyStroke ctrlA = KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK);// overwrite super class's event.jtabOrders.getInputMap().put(ctrlA, "DO_NOTHING");jtabOrders.getActionMap().put("DO_NOTHING", new AbstractAction() {private static final long serialVersionUID = 1L;@Overridepublic void actionPerformed(ActionEvent e) {System.out.println("Do nothing");}});/*** 在JTable里被选择的行发生变化时处理某事件的方法。 例如: 1:选择第一行的状态下,选择第二行时* 2:只选择一行的状态下,追加选择另外的行时*/jtabOrders.getSelectionModel().addListSelectionListener(new ListSelectionListener() {@Overridepublic void valueChanged(ListSelectionEvent e) {DefaultListSelectionModel model = (DefaultListSelectionModel) e.getSource();if (!e.getValueIsAdjusting()) {/** public boolean getValueIsAdjusting()* 一次鼠标的点击会有两次事件响应(按下和释放)。* 前者的事件属性中getValueIsAdjusting()=true,后者是false。* 因此,可以通过判断getValueIsAdjusting()来区别鼠标按下和释放。*/JOptionPane.showMessageDialog(jfrm, "Msg:" +model.getSelectionMode() + " "+ jtabOrders.getValueAt(jtabOrders.getSelectedRow(), 0).toString());}}});jfrm.setLocationRelativeTo(null);jfrm.setVisible(true);jtabOrders.setColumnSelectionAllowed(false);jtabOrders.setRowSelectionAllowed(true);}public static void main(String args[]) {new SelectionModeDemo();}
}

 

 

 http://melodyvictor.blog.163.com/blog/static/1180061572011417315978/


 

//设置是否可以选择此模型中的列。
    jtabOrders.setColumnSelectionAllowed(false);
    //设置是否可以选择此模型中的行。
    jtabOrders.setRowSelectionAllowed(true);

    //设置此表是否允许同时存在行选择和列选择。

     jtabOrders.setCellSelectionEnabled(true);

 

static intMULTIPLE_INTERVAL_SELECTION
          selectionMode 属性的值:一次选择一个或多个连续的索引范围。
static intSINGLE_INTERVAL_SELECTION
          selectionMode 属性的值:一次选择一个连续的索引范围。
static intSINGLE_SELECTION
          selectionMode 属性的值:一次选择一个列表索引。

http://blog.csdn.net/youyigong/article/details/6830966

 

 

 

编写该JTable的TableModel的String getColumnName(int columnIndex)方法
//传进来的是列的索引值
//返回该列的列名/
/给JTable设置好TableModel后,这个方法由系统自动调用
//显示在JTable中
public String getColumnName(int columnIndex){  
return "你想要设置的对应列的列名";
}
eg.:
public String getColumnName(int columnIndex){  
if(columnIndex == 1)
return "索引值为 1 的列的名字";    
if(columnIndex == 2)
return "索引值为 2 的列的名字";  
...
}

 

 

看了一篇实现JTable的列宽与内容的自适应 稍加修饰后如下:

public void FitTableColumns(JTable myTable){JTableHeader header = myTable.getTableHeader();int rowCount = myTable.getRowCount();Enumeration columns = myTable.getColumnModel().getColumns();while(columns.hasMoreElements()){TableColumn column = (TableColumn)columns.nextElement();int col = header.getColumnModel().getColumnIndex(column.getIdentifier());int width = (int)myTable.getTableHeader().getDefaultRenderer().getTableCellRendererComponent(myTable, column.getIdentifier(), false, false, -1, col).getPreferredSize().getWidth();for(int row = 0; row<rowCount; row++){int preferedWidth = (int)myTable.getCellRenderer(row, col).getTableCellRendererComponent(myTable,myTable.getValueAt(row, col), false, false, row, col).getPreferredSize().getWidth();width = Math.max(width, preferedWidth);}header.setResizingColumn(column); // 此行很重要column.setWidth(width+myTable.getIntercellSpacing().width);}
}

http://blog.csdn.net/qof3990/article/details/8578350

http://www.blogjava.net/zeyuphoenix/archive/2010/04/08/317755.html

 

 

 

package swing.table;import java.awt.*;
import java.awt.event.*;import javax.swing.*;
import javax.swing.table.TableColumnModel;public class TestTable extends JFrame {private static final long serialVersionUID = 1L;JTable tb;JPanel p = new JPanel();public TestTable() {setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setLocation(112, 0);setSize(700, 420);final Object[] columnNames = { "档案号", "姓名", "年龄", "性别", "婚姻状况", "职业", "联系电话" };Object[][] rowData = { { "010110", "张三", "28", "男", "已婚", "教师", "13686562936" },{ "010110", "李四", "28", "男", "已婚", "教师", "13686562936" } };tb = new JTable(rowData, columnNames) {private static final long serialVersionUID = 1L;// 添加部分1public boolean isCellEditable(int row, int column) {return false;}};tb.setPreferredScrollableViewportSize(new Dimension(639, 232));// tb.setEnabled(false);tb.setRowHeight(20);tb.setRowSelectionAllowed(true);tb.setSelectionBackground(Color.lightGray);tb.setSelectionForeground(Color.white);tb.setGridColor(Color.black);tb.setShowGrid(true);tb.setShowHorizontalLines(true);tb.setShowVerticalLines(true);tb.setBackground(Color.white);// 添加部分2tb.addMouseListener(new MouseAdapter() {public void mouseClicked(MouseEvent e) {if (e.getButton() == MouseEvent.BUTTON1) {// 双击鼠标if (e.getClickCount() == 2) {    int colummCount = tb.getModel().getColumnCount();// 列数for (int i = 0; i < colummCount; i++){System.out.print(tb.getModel().getColumnName(i)+":");System.out.print(tb.getModel().getValueAt(tb.getSelectedRow(), i).toString() + "   ");}System.out.println();}}}});JScrollPane pane = new JScrollPane(tb);pane.setBackground(Color.white);p.add(pane);add(p);setVisible(true);}public static void main(String[] args) {new TestTable();}
}

 
加载时选中多行:

ListSelectionModel listSelectionModel = new DefaultListSelectionModel();     
listSelectionModel .setSelectionInterval(0, 2);     
table.setSelectionModel(ListSelectionModel);     
listSelectionModel .removeSelectionInterval(1, 1);    
ListSelectionModel listSelectionModel = new DefaultListSelectionModel();      
listSelectionModel .setSelectionInterval(0, 2);      
table.setSelectionModel(ListSelectionModel);      
listSelectionModel .removeSelectionInterval(1, 1);  

 

JTable中列的排序:

package swing.table.sort;import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.math.BigDecimal;
import java.util.regex.Pattern;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.RowSorter;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;public class TestSortedTable {private static int flag = 0;public static void main(String args[]) {JFrame frame = new JFrame("JTable的排序测试");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);final String columnNames[] = { "ID", "姓名", "国籍", "年龄", "体重" };final Object sortRight_1st_withInt[][] = {{ 1, "嘉靖", "中国", 44, 90.5 },{ 3, "姚明", "中国", 25, 120.5 },{ 2, "赵子龙", "西蜀", 1234, 130.6 },{ 10, "曹操", "北魏", 2112, 90.0 },{ 20, "Bill Gates", "美国", 45, 0.5 },{ 5, "Tomas", "英国", 33, 100.0 }};final Object sortWrong_1st_withString[][] = {{ "1", "嘉靖", "中国", 44, "90.5" },{ "3", "姚明", "中国", 25, "120.5" },{ "2", "赵子龙", "西蜀", 1234, "130.6" },{ "10", "曹操", "北魏", 2112, "90.0" },{ "20", "Bill Gates", "美国", 45, "0.5" },{ "5", "Tomas", "英国", 33, "100.0" }};final Object[][] getRightSort_1st_withString = recoverData2Number(sortWrong_1st_withString);final DefaultTableModel model = new CustomizedTableModel(null, null);final JTable table = new JTable(model);table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);// table.setAutoCreateRowSorter(true);table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);// 只能选一行table.getTableHeader().setReorderingAllowed(false);table.setRowSorter(new TableRowSorter<TableModel>(model));JScrollPane pane = new JScrollPane(table);frame.add(pane, BorderLayout.CENTER);JButton changeSourceBtn = new JButton("Change Source");changeSourceBtn.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {if (flag % 3 == 0) {model.setDataVector(sortRight_1st_withInt, columnNames);} else if (flag % 3 == 1) {model.setDataVector(sortWrong_1st_withString, columnNames);} else if (flag % 3 == 2) {model.setDataVector(getRightSort_1st_withString, columnNames);}flag++;}});JButton clearBtn = new JButton("Clear");clearBtn.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {try {RowSorter<?> rowSort = table.getRowSorter();if (rowSort != null) {rowSort.setSortKeys(null);// 如果使用了排序器,先清除对表的排序
                    }((DefaultTableModel) table.getModel()).getDataVector().clear();((DefaultTableModel) table.getModel()).fireTableDataChanged();table.updateUI();} catch (Exception ex) {System.out.println(ex);}}});JPanel southPanel = new JPanel();southPanel.setLayout(new FlowLayout());southPanel.add(changeSourceBtn);southPanel.add(clearBtn);frame.add(southPanel, BorderLayout.SOUTH);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setSize(600, 300);frame.setVisible(true);frame.setLocationRelativeTo(null);}private static Object[][] recoverData2Number(Object[][] sortWrong_1st_withString) {Object[][] target = new Object[sortWrong_1st_withString.length][];for (int i = 0; i < sortWrong_1st_withString.length; i++) {Object[] sourceRecord = sortWrong_1st_withString[i];Object[] targetRecord = new Object[sourceRecord.length];for (int j = 0; j < sourceRecord.length; j++) {Object item = sourceRecord[j];if (isNumericInt(sourceRecord)) {item = Integer.parseInt(item.toString());} else if (isNumericDouble(item)) {item = new BigDecimal(item.toString()).doubleValue();}targetRecord[j] = item;}target[i] = targetRecord;}return target;}private static boolean isNumericInt(Object valueAt) {Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");return pattern.matcher(valueAt.toString().trim()).matches();}private static boolean isNumericDouble(Object valueAt) {Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*\\.?[\\d]*$");return pattern.matcher(valueAt.toString().trim()).matches();}}class CustomizedTableModel extends DefaultTableModel {private static final long serialVersionUID = 1L;public Class<?> getColumnClass(int column) {if (getRowCount() == 0) {return Object.class;}return getValueAt(0, column).getClass();}public CustomizedTableModel(Object[][] data, Object[] columnNames) {super(data, columnNames);}}

排序有两个途径:
(1)为每列的值设置正确的类型,并且重写DefaultTableModel中的getColumnClass方法
因为Integer,Double实现了Comparator接口,即可正确排序
(2)table.setRowSorter(new TableRowSorter<TableModel>(model));
然后为每列指定特定的Comparator:

public class OrderNumberComparator implements Comparator{public int compare(Object o1, Object o2) {int i = (Integer) o1 - (Integer) o2;return i;}}

定义表的时候,选择按自定义算法排序的字段,如果不设置,默认按字符串的ASCII码排序

JTable dataGrid=new JTable ();DefaultTableModel model = (DefaultTableModel) this.dataGrid.getModel();
TableRowSorter<TableModel> sorter=new TableRowSorter<TableModel>(model);
//sorter.setSortable(0, false);
sorter.setComparator(0, new cimframe.util.OrderNumberComparator());
sorter.setComparator(3, new cimframe.util.OrderNumberComparator());
sorter.setComparator(4, new cimframe.util.OrderNumberComparator());
sorter.setComparator(5, new cimframe.util.OrderNumberComparator());
dataGrid.setRowSorter(sorter);



一个关于SWING的工程,当然会用到大量的表格最早清空表格是这样写的

//                DefaultTableModel model = (DefaultTableModel) table.getModel();
//                for (int i = model.getRowCount() - 1; i >= 0; i--) {
//                    model.removeRow(i);
//                }  

用这个方法是有问题的,因为是JTable    >> TableModel  >> TableData(Vector或String[])这样的映射关系,如果用上面的方法,如果数据增加或减少都不会通知TableModel ,就导致每次清数据就报数据越界异常ArrayIndexOutOfBoundsException。

 

如果直接清理数据是会通知上层的监听,改变模型

((DefaultTableModel) table.getModel()).getDataVector().clear();   //清除表格数据
((DefaultTableModel) table.getModel()).fireTableDataChanged();//通知模型更新
table.updateUI();//刷新表格

 

这样做了,程序好像是不出问题了,但是如果对表格做了排序操作,再看看,程序是不出错了,但是每加载一行,就看到表格会做一次排序,这个过程的开销很大,如果数据量大的话,甚至导致内存溢出。经过一天半的研究,跟踪,终于找到了问题所在,创建表的时候,引用了排序器,排序器的监听是一个独立于JTable >> TableModel >> TableData之外,又在后台影响着这三者之间的关系的一个人,在程序调试时,很难找到他在那里影响的,最终在JDK API里发现了一点端倪

javax.swing
类 RowSorter<M>

java.lang.Objectjavax.swing.RowSorter<M>
类型参数:
M - 底层模型的类型

 setSortKeys

public abstract void setSortKeys(List<? extends RowSorter.SortKey> keys)
设置当前排序键。
参数:
keys - 新的 SortKeysnull 是指定一个空列表的简写,表示视图应该是未排序的。
toggleSortOrder
public abstract void toggleSortOrder(int column)
颠倒指定列的排序顺序。调用此方法时,由子类提供具体行为。通常,如果指定列已经是主要排序列,则此方法将升序变为降序(或将降序变为升序);否则,使指定列成为主要排序列,并使用升序排序顺序。如果指定列不可排序,则此方法没有任何效果。

如果此方法导致更改排序顺序和排序操作,则它将发送适当的 RowSorterListener 通知。

 

参数:
column - 要切换排序顺序的列,就底层模型而言
抛出:
IndexOutOfBoundsException - 如果列超出底层模型的范围

上面这两个方法很像,但又有区别,我先用toggleSortOrder(int column) 这个column必须有一个有效的列号,就是说,不能用-1,这个方法是不能取消对表的排序选中的。那么另一个方法setSortKeys(List<? extendsRowSorter.SortKey> keys),这个就比较难了,我也不知道应该传什么参数,再看参数说明:null 是指定一个空列表的简写,表示视图应该是未排序的。“应该”两字说的实在是诡异,我就把它当成死马医,看看到底行不行,嘿嘿,通过方法:rowSort.setSortKeys(null);把表格还原到不排序的状态,就达到我想要的结果了,大功终于告成!

http://blog.csdn.net/aptweasel/article/details/7028058

 

http://www.cnblogs.com/tianyaxue/p/3494291.html

http://jingyan.baidu.com/article/fedf07377f003035ac8977c3.html

 

Java JTable 点击表头,能不能进行多列排序

建议已现有Jtable开发新的Table类,加个数组用于记录排序列的先后次序,重写Jtable的表头单击事件

 

转载于:https://www.cnblogs.com/softidea/p/4535890.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/544745.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#操作Cookie

简单的存储Cookie和获取Cookie例子 public string SaveCookie(string name) {// 登陆成功要将必要数据存储到 Cookie 里HttpCookie httpCookie new HttpCookie("cookie");// 设置过期时间httpCookie.Expires DateTime.Now.AddHours(1);// 设置姓名httpCookie.Valu…

Java生成随机数的4种方式,以后就用它了!

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;在 Java 中&#xff0c;生成随机数的场景有很多&#xff0c;所以本文我们就来盘点一下 4 种生成随机数的方式&#xff0c;以…

Java LinkedList addFirst()方法与示例

LinkedList addFirst()方法 (LinkedList addFirst() method) This method is available in package java.util.LinkedList. 软件包java.util.LinkedList中提供了此方法。 This method is used to insert an object at the initial or beginning stage of the linked list. 此方…

二层冗余网络引起的问题

1.广播风暴 环路会引起广播风暴 网络中主机会收到重复数据帧 2.MAC地址表震荡 环路引起的MAC地址表震荡&#xff0c;交换机死机 3.有可能收到重复的流量转载于:https://www.cnblogs.com/hotshotgg/p/4537817.html

Everything是如何搜索的

写在前面 使用了Everything之后&#xff0c;一直对他的搜索速度感兴趣&#xff0c;在网上也看了很多对其原理的揭秘&#xff0c;终于有空找了个源码研究了一下&#xff0c;原理就是对NTFS的USN特性进行使用。 原理 详细解释我参照别人家的博客来一段&#xff1a; 当扇区的文…

漫话:如何给女朋友解释String对象是不可变的?

String的不变性String在Java中特别常用&#xff0c;相信很多人都看过他的源码&#xff0c;在JDK中&#xff0c;关于String的类声明是这样的&#xff1a;public final class String implements java.io.Serializable, Comparable<String>, CharSequence { }可以看到&#…

XenServer 6.5实战系列之十一:Install Update For XenServer 6.5

为了保证XenServer主机的安全及功能的更新&#xff0c;在企业环境中我们需要定期的到Citrix官网或通过XenCenter进行下载和更新。今天我们会从在线和离线两种不同的方法进行Update的安装。更新补丁之前请务必阅读对应Update的相关资料、注意事项和做好备份。1. 离线安装更新在…

机器学习 属性_属性关系文件格式| 机器学习

机器学习 属性Today, we will be looking at the use of attribute relation file format for machine learning in java and we would be writing a small java code to convert the popularly used .csv file format into the arff (Attribute relation file format). This f…

C#标记废弃方法

一、普通用法 在C#中&#xff0c;如果一个方法我们不再使用&#xff0c;我们可以将其标记为“废弃”的方法&#xff0c;只需要在方法前&#xff0c;加一个[Obsolete]即可&#xff1b; [Obsolete] public void BiuBiuBiu(){// 嘿嘿嘿 }废弃方法并非不能使用&#xff0c;而是在…

阿里二面一问MySQL就开始野了,抓着底层原理不撒手啊!

最近项目增加&#xff0c;缺人手&#xff0c;面试不少&#xff0c;但匹配的人少的可怜。跟其他组的面试官聊&#xff0c;他也抱怨了一番&#xff0c;说候选人有点儿花拳绣腿&#xff0c;回答问题不落地&#xff0c;拿面试最常问的MySQL来说&#xff0c;并不只是懂“增删改查”、…

[转]“Ceph浅析”系列之(—)—Ceph概况

转载自&#xff1a;http://yizhaolingyan.net/?p11本文将对Ceph的基本情况进行概要介绍&#xff0c;以期读者能够在不涉及技术细节的情况下对Ceph建立一个初步印象。2.1 什么是Ceph&#xff1f;Ceph的官方网站Ceph.com上用如下这句话简明扼要地定义了Ceph&#xff1a;“Ceph…

关于C#监视剪贴板信息

##1、常规方法 在C#中&#xff0c;有一个常规检测剪贴板的方法&#xff0c;用的是 System.Windows.Forms.Clipboard&#xff1b; 使用起来很简单&#xff0c;代码如下&#xff1a; /// <summary> /// 设置剪贴板的文本内容 /// </summary> /// <param name&qu…

图解Java中的18 把锁!

乐观锁和悲观锁独占锁和共享锁互斥锁和读写锁公平锁和非公平锁可重入锁自旋锁分段锁锁升级&#xff08;无锁|偏向锁|轻量级锁|重量级锁&#xff09;锁优化技术&#xff08;锁粗化、锁消除&#xff09;乐观锁和悲观锁悲观锁悲观锁对应于生活中悲观的人&#xff0c;悲观的人总是想…

在CSS中使用not:first-child选择器

Introduction: 介绍&#xff1a; Well, selectors are a very common term to deal with while we are developing a website or web page. You might know quite a few of them and might as well be implementing them. You might also have noticed that all the selectors…

linux/unix 段错误捕获【续】

本文为“在C/C中捕获段错误&#xff0c;打印出错的具体位置”的续篇&#xff0c;进一步解决涉及动态链接库的情况。背景知识&#xff1a;linux/unix下动态链接库的基本原理/proc/pid/maps文件的基本格式动态链接库&#xff1a;在进程执行过程中动态加载&#xff0c;进程间可以共…

C#获取屏幕大小的“简单整理”。。

额…… 首先是有一个需求&#xff0c;两个显示器&#xff0c;程序自动获取自己所在的显示器大小&#xff0c;并显示到右下角。 我们都知道C#有一个Screen.PrimaryScreen.Bounds&#xff0c;可以获取屏幕的完整尺寸&#xff0c;但是只能获取主显示器的尺寸&#xff0c;后来我发…

Spring为什么建议构造器注入?

来源 | juejin.cn/post/6844904056230690824作者 | Richard_Yi本文的内容主要是想探讨我们在进行 Spring 开发过程当中&#xff0c;关于依赖注入的几个知识点&#xff0c;具体内容如下&#xff1a;Autowired, Resource, Inject 三个注解的区别当你在使用Autowired时&#xff0…

c#中的long类型示例_C#中带示例的带符号字节数组

c#中的long类型示例C&#xff03;中的有符号字节数组 (Signed Byte Array in C#) In C#.Net, we can create a signed byte array by using sbyte, sbyte is used to store both of the values (negative and positive) between the range of -128 to 127 (Signed 8 bits integ…

Shell中的while循环

while循环的格式while expressiondocommandcommanddone1、计数器控制的while循环主要用于已经准确知道要输入的数据和字符串的数目。举例1 #!/bin/sh2 int13 while(( $int<5 ))4 do5 echo $int6 let "int"7 done2、结束标记控制的while循环主要用于不知道读入数据…

一文玩转 EhCache 缓存框架!

Ehcache 介绍EhCache 从 Hibernate 发展而来&#xff0c;是一个纯Java的进程内缓存框架&#xff0c;具有快速、精干等特点。Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存&#xff0c;Java EE和轻量级容器。它具有内存和磁盘存储&#xff0c;缓存加载器&#x…