Java JOptionPane.showMessageDialog的可选替代项

Java JOptionPane.showMessageDialog的可选替代项,java,swing,Java,Swing,后台搜索信息: 我有一个在海军的朋友,他想知道我是否能给他开发一个小应用程序,当他有警卫职责时可以计算,因为显然,指望日历是很难的。我使用JOptionPane.showMessageDialog给他日期的输出。我是这样做的 GregorianCalendar knownDate = new GregorianCalendar(year,month,day); GregorianCalendar[] futureDates = new GregorianCalendar[10]; for(in

后台搜索信息

我有一个在海军的朋友,他想知道我是否能给他开发一个小应用程序,当他有警卫职责时可以计算,因为显然,指望日历是很难的。我使用
JOptionPane.showMessageDialog
给他日期的输出。我是这样做的

GregorianCalendar knownDate = new GregorianCalendar(year,month,day);

GregorianCalendar[] futureDates = new GregorianCalendar[10];
for(int i = 0; i < 10; i++) {
    futureDates[i] = new GregorianCalendar(year,month,day);
    futureDates[i].add(Calendar.DAY_OF_MONTH,10*(i+1)); // duty every 10 days
}
String newline = System.getProperty("line.separator");
StringBuilder sb = new StringBuilder("Jakes duty dates:").append(newline);
for(GregorianCalendar d : futureDates) {
    sb.append(months[d.get(Calendar.MONTH)]).append(" ");
    sb.append(d.get(Calendar.DAY_OF_MONTH)).append(newline);
}
JOptionPane.showMessageDialog(null,sb.toString());
GregorianCalendar knownDate=新的GregorianCalendar(年、月、日);
GregorianCalendar[]未来日期=新的GregorianCalendar[10];
对于(int i=0;i<10;i++){
未来日期[i]=新的格里高利安日历(年、月、日);
futureDates[i].add(日历.月日,10*(i+1));//每10天值班一次
}
字符串newline=System.getProperty(“line.separator”);
StringBuilder sb=新StringBuilder(“Jakes职责日期:”)。追加(换行符);
对于(GregorianCalendar d:未来日期){
某人加上(月[日历月])。加上(“”);
sb.append(d.get(日历日期/月份)).append(换行符);
}
showMessageDialog(null,sb.toString());
“唯一的问题”是无法选择显示的文本。他想在IM和电子邮件中选择它,因为只有一半的懒惰有什么意义,对吗?(唯一的问题是引用,因为我有一种感觉,他会把这件事弄得死去活来……哈哈)

我的问题


是否有“一行解决方案”来创建可选择的
showMessageDialog

将日期添加到
DefaultListModel
,创建
JList
,并将列表传递到
showMessageDialog()
。它不止一行,但选择内容会使用平台的
copy
按键复制到剪贴板

private static final DateFormat df = new SimpleDateFormat("dd-MMM");

private static void createAndShowGUI() {
    DefaultListModel dlm = new DefaultListModel();
    for (int i = 0; i < 10; i++) {
        GregorianCalendar knownDate = new GregorianCalendar();
        knownDate.add(Calendar.DAY_OF_MONTH, 10 * i);
        dlm.add(i, df.format(knownDate.getTime()));
    }
    JList list = new JList(dlm);
    JOptionPane.showMessageDialog(null, list);
}
private static final DateFormat df=new SimpleDateFormat(“dd MMM”);
私有静态void createAndShowGUI(){
DefaultListModel dlm=新的DefaultListModel();
对于(int i=0;i<10;i++){
GregorianCalendar knownDate=新的GregorianCalendar();
添加(日历日,每月10*i);
add(i,df.format(knownDate.getTime());
}
JList列表=新的JList(dlm);
showMessageDialog(空,列表);
}

我能够根据垃圾神的答案来构建。虽然他建议使用
JList
,但我使用的是JTextArea(它提供了我需要的选择类型)

以下是我正在做的:

JTextArea text = new JTextArea(sb.toString());
JOptionPane.showMessageDialog(null,text);
而且它工作起来很有魅力

================================================

经过一点试验后,我做了以下工作:

DefaultListModel model = new DefaultListModel();
for(GregorianCalendar g : futureDates) {
    String m = months[g.get(Calendar.MONTH)];
    String d = String.valueOf(g.get(Calendar.DAY_OF_MONTH));
    model.addElement(m + " " + d);
}
JList jlist = new JList(model);

JOptionPane.showMessageDialog(null,jlist);

JOptionPane.showMessageDialog(null,jlist.getSelectedValue());

第二个框显示了我在第一个框中选择的内容。这给我留下了深刻的印象。诚然,这不是我想要的功能(最上面的部分是),但这并不会让它变得不那么棒!:-)

为方便起见,您可以在列表选择侦听器中自动复制到系统剪贴板。谢谢您的尝试,但这不是我所说的选择。这当然很酷,它允许我选择一行,但我的意思是。。。选择要复制到剪贴板的整个文本块。这就是问题!很多组件都支持这种功能。是的,非常酷。值得赞扬的是,JList对选择的定义可能比我所指的要普遍得多!顺便说一句,
DefaultListSelectionModel
允许您执行常规操作,如全选和多选。超级酷!我会记住这一点,因为我正在为一个更严肃的项目做一些摇摆运动。这对一个朋友来说只是一件一次性的事情,但我很高兴我能从中学到一些非常有用的东西!非常感谢!