0

ビデオを再生するアプリケーションを実行しており、JLabel でビデオのタイムコードを表示しています。また、ビデオの字幕を変更できる JCombobox もあります。その JCombobox には、コンボボックスの各項目のデフォルト出力を変更する ListCellRenderer があります。問題は、JLabel がその値を変更するたびに、JCombobox が再度レンダリングされることです。

これはリソースの無駄だと思いますが、その動作を変更する方法はありますか?.

JComboBox に関連するコードがあります。JLabel は、swing.Timer によって毎秒変更されます。

JComboBox comboBox = new JComboBox<>();

comboBox.setEditable(false);


    DefaultComboBoxModel<File> defaultComboBox = new DefaultComboBoxModel<>();
    for (File f : Player.capitulo.getFicheros()) {

        if (f.getAbsolutePath().endsWith(".srt")) {
            System.out.println(f.getAbsolutePath());
            defaultComboBox.addElement(f);
        }
    }
 comboBox.setModel(defaultComboBox);
 comboBox.setRenderer(new ListRenderer());


public class ListRenderer implements ListCellRenderer<File> {
protected DefaultListCellRenderer defaultRenderer = new DefaultListCellRenderer();

@Override
public Component getListCellRendererComponent(JList<? extends File> list,
        File value, int index, boolean isSelected, boolean cellHasFocus) {
    JLabel renderer = new JLabel();
    // JLabel renderer = (JLabel) defaultRenderer
    // .getListCellRendererComponent(list, value, index, isSelected,
    // cellHasFocus);
    if (value != null) {
        Path p = value.toPath();
        System.out.println(p.getParent());
        String language = value.getName().trim().replace(".srt", "");
        language = language.substring(language.lastIndexOf(".") + 1,
                language.length());

        // System.out.println(language.length());
        if (language.length() == 3) {
            renderer.setText(language);
        } else {
            renderer.setText("Subtitulo " + (index + 1));
        }

    }

    return renderer;
}
}

更新:問題を再現する例を次に示します

わかりました、これが SSCCE コードです。例を実行すると、JCombobox の同じ行にある JLabel が同じ問題を再現するが、他の行にある場合は発生しないことに気付きました。

public class Example extends JFrame {

    private JPanel contentPane;
    private JLabel lblNewLabel;
    private JComboBox<String> comboBox;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Example frame = new Example();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public Example() {
        initGUI();
    }
    private void initGUI() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 428, 362);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);

        lblNewLabel = new JLabel("New label");
        contentPane.add(lblNewLabel, BorderLayout.WEST);
        Timer t = new Timer(1000, new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                Random r = new Random();
                lblNewLabel.setText(String.valueOf(r.nextInt()));

            }
        });
        t.start();
        comboBox = new JComboBox<>();
        comboBox.setRenderer(new ListCellRenderer<String>() {

            @Override
            public Component getListCellRendererComponent(
                    JList<? extends String> list, String value, int index,
                    boolean isSelected, boolean cellHasFocus) {
                JLabel label = new JLabel("");
                System.out.println("Pass");
                return label;
            }
        });
        contentPane.add(comboBox, BorderLayout.CENTER);
    }

}
4

0 に答える 0