【问题标题】:How to get selected element text from jlist with image icon?如何从带有图像图标的 jlist 中获取选定的元素文本?
【发布时间】:2018-04-19 11:30:25
【问题描述】:

Error Image Using Object 我正在尝试在 jlist 的 jtextfield 中显示选定的元素文本。该列表包含数据库数据和图像,其中从列表中获取所选值会引发错误。

线程“AWT-EventQueue-0”java.lang.ClassCastException 中的异常:hive.test.ImgsNText 无法转换为 java.lang.String

我的代码

String index = String.valueOf(jList1.getSelectedIndex());
jTextField1.setText(index);
String s = (String) jList1.getSelectedValue();
jTextField2.setText(s);

获取数据库数据并在jlist-code中显示

try {
        Class.forName("org.apache.hive.jdbc.HiveDriver");
        Connection con = DriverManager.getConnection("jdbc:hive2://localhost:10000/default", "arunachalam", "");
        Statement st = con.createStatement();
        String sql = "show databases";
        ResultSet rs = st.executeQuery(sql);

        while (rs.next()) {
            String s1 = rs.getString(1);
            dm.addElement(new ImgsNText(s1, new ImageIcon("images/hive_db.png")));
        }
        jList1.setCellRenderer(new Renderer());
        jList1.setModel(dm);
        if(jList1.isSelectedIndex(0))
        {

        }
    } catch (Exception e) {
        showMessageDialog(null, "Exception");
    }

建议我如何从 jlist 中单独获取文本并将其显示在 jtextfield 中。

【问题讨论】:

  • 您必须创建一个标签的ListCellRenderer,其中包含列表中的图像和字符串
  • 你能提供你的异常日志吗

标签: hive jtextfield jlist selecteditem


【解决方案1】:

首先,您必须创建一个ListCellRenderer,用于在List 中显示图像和文本。然后在列表上调用ListSelectionListener,捕获单击列表选择的事件。然后获取所选项目并在文本字段中设置所选项目的文本。

更新代码

import java.awt.Component;
import java.awt.Container;
import java.awt.FlowLayout;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import javax.swing.DefaultListModel;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JTextField;
import javax.swing.ListCellRenderer;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class ListExample implements ListSelectionListener {

  JList list;
  DefaultListModel listModel;
  JTextField txtField;
  Connection connection;
  PreparedStatement pst;
  ResultSet rs;

  public ListExample() {
    JFrame.setDefaultLookAndFeelDecorated(true);
    JFrame frame = new JFrame("LIST");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    Container con = frame.getContentPane();

    ListRenderar rendrar = new ListRenderar();
    list = new JList();
    txtField = new JTextField(10);

    listModel = new DefaultListModel();
    try {
      Class.forName("com.mysql.jdbc.Driver");
      connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/ganesh", "root",
          "admina");
      pst = connection.prepareStatement("show databases");
      rs = pst.executeQuery();
      while (rs.next()) {
        String text = rs.getString(1);
        listModel.addElement(new ImgNText(text, new ImageIcon("/images/help.gif")));
      }
    } catch (Exception e) {
      e.printStackTrace();
    }

    list.setModel(listModel);

    list.setCellRenderer(rendrar);
    list.addListSelectionListener(this);

    con.add(list);
    con.add(txtField);

    con.setLayout(new FlowLayout());

    frame.setVisible(true);
    frame.pack();
  }

  public class ListRenderar extends JLabel implements ListCellRenderer {

    @Override
    public Component getListCellRendererComponent(JList list, Object value, int index,
                                                  boolean isSelected, boolean cellHasFocus) {

      ImgNText imgNtext = (ImgNText) value;
      ImageIcon icon = imgNtext.getImage();
      String name = imgNtext.getText();

      setIcon(icon);
      setText(name);

      return this;
    }
  }

  public void valueChanged(ListSelectionEvent e) {
    ImgNText obj = (ImgNText) list.getSelectedValue();
    txtField.setText(obj.getText());
  }

  public class ImgNText {

    ImageIcon image;
    String text;

    public ImgNText(String text, ImageIcon image) {
      this.image = image;
      this.text = text;
    }

    public ImageIcon getImage() {
      return image;
    }

    public String getText() {
      return text;
    }
  }

  public static void main(String args[]) {
    new ListExample();
  }
}

【讨论】:

  • 感谢 ganesh,但您使用的是预定义数据。我处理它以获取并在带有图像图标的列表中显示数据库数据。完成后,我需要将所选项目从 jlist 显示到 jtextfield。有没有其他方法可以解决问题。我尝试了对象,同样的错误如下。
  • @Arunachalam 你可以看到我从数据库中获取数据的更新代码
  • 在 windows 操作系统中 String s = (ImgNText)jList1.getSelectedValue(); jTextField1.setText(s1);使用 netbeans 可以正常工作。在 ubuntu 中执行相同操作会引发无法使用图像投射文本的错误。你有什么想法吗? Mysql 数据库运行良好,我需要在 apache hive 中做。
  • 我,我正在使用 jdk 8 oracle。没有打开jdk。如果问题解决了,我会接受答案的,不用担心
  • 其实我的朋友,你不能将 ImgNText 文件转换成字符串,你必须将对象复制到引用中,然后你必须调用 getter 方法来获取文本
猜你喜欢
  • 2012-10-31
  • 1970-01-01
  • 2017-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-24
  • 2014-02-25
  • 1970-01-01
相关资源
最近更新 更多