Vývojáři open source storage platformy TrueNAS oznámili, že s verzí 25.04 s kódovým názvem Fangtooth končí TrueNAS CORE postavený na FreeBSD a TrueNAS SCALE postavený na Linuxu. Jejich společným pokračováním bude TrueNAS Community Edition postavený na Linuxu.
Mapy Google dnes slaví 20 let. Spuštěny byly 8. února 2005. Svět se přesunul od papírových map k digitálním. A ke Street View, Live View, Immersive View, …
Hector "marcan" Martin, vedoucí projektu Asahi Linux aneb Linux na Apple Siliconu, skončil jako upstream vývojář linuxového jádra. Se slovy "už nemám žádnou důvěru v proces vývoje jádra … další vývoj Apple/ARM bude pokračovat downstream" odstranil své jméno ze souboru MAINTAINERS. Důvodem jsou neshody kolem Rustu v linuxovém jádru [Hacker News, No rust code in kernel/dma, please.].
Mistral AI včera představil nový vylepšený Le Chat. Nově také jako aplikace pro iOS a Android.
Britské bezpečnostní orgány nařídily americké firmě Apple, aby vytvořila takzvaná "zadní vrátka", která by umožnila dostat se k šifrovanému obsahu uživatelů uloženému v cloudu. Tajné nařízení, vydané v lednu, vyžaduje plošný přístup k šifrovanému účtu jakéhokoliv uživatele přístrojů Apple kdekoliv na světě. Britské úřady tedy Apple nežádají pouze o asistenci s přístupem k účtu konkrétního uživatele, ale rovnou chtějí mít přístup ke všem účtům, kdykoliv budou chtít.
Byla vydána (𝕏) lednová aktualizace aneb nová verze 1.97 editoru zdrojových kódů Visual Studio Code (Wikipedie). Přehled novinek i s náhledy a animovanými gify v poznámkách k vydání. Ve verzi 1.97 vyšlo také VSCodium, tj. komunitní sestavení Visual Studia Code bez telemetrie a licenčních podmínek Microsoftu.
Nedávno se povedlo do pdf souborů vložit Tetris a DOOM a po otevření příslušného pdf souboru v na Chromiu založeném webovém prohlížeči vybranou hru přímo v pdf spustit. LinuxPDF ukazuje, že do pdf lze vložit také RISC-V emulátor a rozběhnout Linux.
Kancelářský balík LibreOffice byl vydán ve verzi 25.2. Podrobnosti v poznámkách k vydání.
Byla vydána nová stabilní major verze 24.10 linuxové distribuce primárně určené pro routery a vestavěné systémy OpenWrt (Wikipedie). Jedná se o nástupce předchozí major verze 23.05. Přehled novinek v poznámkách k vydání. Podporováno je více než 1970 zařízení. Samozřejmě včetně OpenWrt One. Linux byl povýšen z verze 5.15 na verzi 6.6.
Dobry den,
neexistuje, prosim Vas, nejaky jednoduchy zpusob, jak nastavit pri programovani v Jave komponentu JButton tak, aby reagovala (vytvorila ActionEvent) po stisku Enter a nikoli po stisku mezerniku? Pripada mi dost neohrabane odchytavat navic KeyEvent, testovat, zda byl stisknut Enter a psat prakticky to same dvakrat (KeyListener a AcitonListener). Patrne je to zcela trivialni zalezitost, ale ja se k tomu nejak nemohu propracovat. Pan Herout v ucebnici Java (II. díl) píše, že implicitní klávesou pro stisk tlacitka je mezernik a pro pouziti jinych klaves je treba naprogramovat metody keyPresed nebo keyReleased (coz jsem zkusil aplikovat, ale nic moc), jine rozumne informace jsem bohuzel nenasel ani v Java Tutorialu ani v ruznych clancich a konferencich o programovani v Jave. Pripada mi divne, ze napr. tlacitko u MessageDialog reaguje zcela obvyklym zpusobem, tj. na stisk Enter, zatimco tlacitka u FileDialog reaguji implicitne stejne jako JButton, tj. na stisk mezerniku, a nechci pripadnym uzivatelum vysvetlovat, proc se jedno tlacito macka entrem a jine mezernikem. Pro graficky navrh pouzivam NetBeans 4.1 a JDK 1.4.
Za postrceni spravnym smerem dekuji a omlouvam se za OT, ktere ma s Linuxem spolecne jen to, ze na nem je vyvojove prostredi.
private onButtonAction() { kodKteryNecoDela(); } private initGUI() { // ... bn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ev) { onButtonAction() } }); bn.addKeyListener(new KeyListener() { public void keyTyped(KeyEvent ev) {} public void keyPressed(KeyEvent ev) {} public void keyReleased(KeyEvent ev) { if (ev.getKeyCode() == KeyEvent.VK_ENTER) { onButtonAction() } } }); // ... }
Ale ano, k podobnemu reseni jsem take dospel (jeste jsem navic nasimuloval stisk a uvolneni tlacitka pomoci setPressed()), jen mi to pripada trochu nestastne, zvlaste v pripade, kdy stiskem tlacitka (T-1) vyvolam dialog (napr. MessageDialog), tento dialog ukoncim stisknutim tlacitka (T-2) klavesou enter a tato udalost je soucasne odchycena i tlacitkem T-1 a opet vyskoci dialog a tak dokola. Navic u komponenty JFileChooser patrne nebudu moci tento postup odchytavani udalosti u jednotlivych tlacitek pouzit a nechci mit cast tlacitek ovladanych tak a cast jinak.
Tam pak bude něco shnilélo... ta událost nemůže být odchycena tlačítkem, kterému není přiřazena. Můžeš sem dát nějaký nástin?
Jestliže tam nemáš anonymní třídy, ale jednu, kterou jsi vytvořil a pak přiřadil k oběma tlačítkům, musíš rozlišit, které z tlačítek bylo stisknuto, možná skrze event.getSource() (viz API). Ale to snad máš .
Tlacitka jsou rozlisovana pomoci getSource(), to je v poradku, problem je asi v tom, ze pokud stisknete klavesu, nejste patrne schopen odhadnout kdy ji uz musite pustit. Nejspise dochazi k tomu, ze kdyz dialog po stisku enter zmizi, klavesa enter se nachazi stale ve stisknutem stavu a jedinym posluchacem KeyEvent je opet puvodne stisknute tlacitko T-1, ktere na udalost bleskove zareaguje. Pozn.: Klavesy mackam celkem normalne, ne jako lenochod.
To jsem zkusil taky, volani akcni metody jsem dal do tela metody keyPressed (reakce na stisk) pak i do keyReleased (reakce na uvolneni), ale neni to ono. Mam za to, za ActionEvent je u tlacitka generovana az po splneni vice podminek (napr. tlacitko musi mit fokus, musi byt nejprve stisknuto a pak uvolneno atd.), ktere charakterizuji stisk a uvolneni tlacitka a pouzitim KeyEvent tak patrne narusim spravnou funkci tlacitka, resp. je to jako kdybych nastartoval auto jen tim, ze otevru dvere u sofera a jiz nebylo treba strcit klicek do zapalovani a otocit s nim.
Událost keyTyped(KeyEvent e)
Tak toto jsem nezkousel, cit P.Herout (Ucebnice Java II.díl).:
Pozor:
Budeme-li obsluhovat pouze metodu keyTyped(), nemuzeme pouzit metodu int getKeyCode(), respektive muzeme, ale dostaneme vzdy hodnotu 0. Tuto metodu lze pouzit jen v metodach keyPressed() nebo keyReleased().
Kdyz nemohu pouzit getKeyCode(), jak tedy zjistim, ze byl stisknut zrovna Enter? Krome toho mam pocit, ze to stale neresi to, co bych si predstavoval, a to jest - nahrazeni stisku mezerniku stiskem Enter se vsi paradou.
Keyboard Bindings in SwingJsou tam i nějaké náznaky příkladů pro JButton.
Ten kód, který jsem dal hned jako první odpověď je funkční, sám jsem jej použil. Dokonce i na ten samý problém, myslím
Presne tento kod jsem v prvnich pokusech pouzil take. Problem je v tom, ze je funkcni az moc. Jak jsem psal drive, pokud tlacitko T-1 reaguje na keyReleased() a timto tlacitkem vyvolam dialog s tlacitkem T-2, pak po stisku Enter dialog zmizi a tlacitko T-1 staci opet zareagovat na ten samy stisk, resp. uvolneni klavesy.
Trochu jsem to upravil, tzn. ponechal jsem jen obsluhu KeyEvent
/* * Tlacitko.java * * Created on 16. říjen 2005, 15:30 */ /** * * @author ondra */ public class Tlacitko extends javax.swing.JFrame implements java.awt.event.ActionListener, java.awt.event.KeyListener { /** Creates new form Tlacitko */ public Tlacitko() { initComponents(); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ private void initComponents() { jPanel1 = new javax.swing.JPanel(); jButton1 = new javax.swing.JButton(); getContentPane().setLayout(new java.awt.FlowLayout()); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); jButton1.setMnemonic('T'); jButton1.setText("Tla\u010d\u00edtko"); jButton1.setSelected(true); jButton1.addActionListener(this); jButton1.addKeyListener(this); jPanel1.add(jButton1); getContentPane().add(jPanel1); pack(); } // Code for dispatching events from components to event handlers. public void actionPerformed(java.awt.event.ActionEvent evt) { if (evt.getSource() == jButton1) { Tlacitko.this.jButton1ActionPerformed(evt); } } public void keyPressed(java.awt.event.KeyEvent evt) { if (evt.getSource() == jButton1) { Tlacitko.this.jButton1KeyPressed(evt); } } public void keyReleased(java.awt.event.KeyEvent evt) { if (evt.getSource() == jButton1) { Tlacitko.this.jButton1KeyReleased(evt); } } public void keyTyped(java.awt.event.KeyEvent evt) { } private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { //GEN-FIRST:event_jButton1ActionPerformed } //GEN-LAST:event_jButton1ActionPerformed private void jButton1KeyReleased(java.awt.event.KeyEvent evt) { //GEN-FIRST:event_jButton1KeyReleased int kod1 = evt.getKeyCode(); if (kod1 == java.awt.event.KeyEvent.VK_ENTER) { javax.swing.ButtonModel bm = jButton1.getModel(); bm.setPressed(false); jButton1.setModel(bm); javax.swing.JOptionPane.showMessageDialog(this,"Tlačítko stisknuto!"); } } //GEN-LAST:event_jButton1KeyReleased private void jButton1KeyPressed(java.awt.event.KeyEvent evt) { //GEN-FIRST:event_jButton1KeyPressed int kod1 = evt.getKeyCode(); if (kod1 == java.awt.event.KeyEvent.VK_ENTER) { javax.swing.ButtonModel bm = jButton1.getModel(); bm.setPressed(true); jButton1.setModel(bm); } } //GEN-LAST:event_jButton1KeyPressed /** * @param args the command line arguments */ public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new Tlacitko().setVisible(true); } }); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton jButton1; private javax.swing.JPanel jPanel1; // End of variables declaration//GEN-END:variables }
Fuj, přesně tenhle styl kódování jsem na Heroutovo knihách nesnášel. Nepochopím, proč by celá mamutí třída Frame měla implementovat kopici Listenerů . Nicméně, k věci.
V tomhle konkrétním případě je potřeba použít keyPressed a událost po použití sežrat. Ony dvě metody jsem upravil takto:
private void jButton1KeyReleased(java.awt.event.KeyEvent evt) { int kod1 = evt.getKeyCode(); if (kod1 == java.awt.event.KeyEvent.VK_ENTER) { javax.swing.ButtonModel bm = jButton1.getModel(); bm.setPressed(false); jButton1.setModel(bm); } } private void jButton1KeyPressed(java.awt.event.KeyEvent evt) { int kod1 = evt.getKeyCode(); if (kod1 == java.awt.event.KeyEvent.VK_ENTER) { javax.swing.ButtonModel bm = jButton1.getModel(); bm.setPressed(true); jButton1.setModel(bm); javax.swing.JOptionPane.showMessageDialog(this,"Tlačítko stisknuto!"); evt.consume(); } }
Čili, z keyReleased jsem vyhodil dialog a přesunul ho do Pressed. Navíc jsem nechal událost sežrat samu sebe .
getRootPane().setDefaultButton(...)
. Pokud stisknes enter a nic jinyho to neobslouzi, tak root pane udela action na tom tlacitku. Vic viz. javadoc.
Na to jsem uz koukal take. Bohuzel setDefaultButton() nastavi pouze implicitni tlacitko, tj. zvyraznene tlacitko, ktere ma prednost. V pripade, ze je ve formulari tlacitek vice, lze stiskem Enter obslouzit pouze toto jedine "Default" tlacitko, a to i v pripade, ze fokus ma jine tlacitko a chci stiskem Enter obslouzit prave to fokusovane tlacitko. Patrne by slo spojit tuto metodu s metodou zjistujici fokus a jako defaultni nastavit prave to tlacitko, ktere ma fokus. Nicmene je to porad pro mne nepochopitelne harakiri, kteremu bych se rad vyhnul. Stale tak nejak ocekavam, ze jsem nekde tupe prehledl metodu, kterou se to da zmenit jednoduse, neco jako setKlavesaTlacitka(VK_ENTER). Stejne prece funguje setMnemonic(), zde take nemusim pro kombinaci ALT+Klavesa pachat navic dvacet radek programu.
Jeste jednou se omlouvam za OT.
ZREJME VYRESENO
Dalsi prohlidkou cizich aplikaci jsem zjistil, ze vetsina jich pouziva nastaveni klavesy Enter prave pomoci setDefaultButton(), tudiz mnou hledane reseni patrne neexistuje a vsichni to obchazeji, budu to tedy obchazet take. Reseni pomoci zjisteni fokusu komponenty a nasledne nastaveni pomoci setDefaultButton() neni zas az tak hrozne a hlavne tlacitka funguji podle ocekavani.
Dekuji vsem za pomoc.
Co kdybys potřeboval, aby ti na Enter reagovalo několik tlačítek, vždy právě to aktuálně zaměřené? To skrze setDefaultButton asi nenastavíš. Nebo ano?
Ano. Pomoci metod FocusGained() a FocusLost(), kdyz setDefaultButton() nastavim v tele techto metod.
Priklad:
private void jButton1FocusGained(java.awt.event.FocusEvent evt) { getRootPane().setDefaultButton(jButton1); } private void jButton1FocusLost(java.awt.event.FocusEvent evt) { getRootPane().setDefaultButton(null); }
Funguje to dobre a hlavne okolo toho neni treba delat zadne dalsi opicky, staci odchytavat ActionEvent konkretniho tlacitka.
public class TestApp extends JDialog implements ActionListener { private JButton btnTest1; private JButton btnTest2; /** * Creates a new instance of TestApp */ public TestApp() { super(); initDialog(); } private void initDialog() { setTitle("Test Application"); setLocationRelativeTo(null); setDefaultCloseOperation(DISPOSE_ON_CLOSE); getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "handleEnter"); getRootPane().getActionMap().put("handleEnter", new EnterDialogAction()); addComponents(); } private void addComponents() { btnTest1 = new JButton("Test 1"); btnTest1.setActionCommand("TEST1"); btnTest1.addActionListener(this); btnTest2 = new JButton("Test 1"); btnTest2.setActionCommand("TEST1"); btnTest2.addActionListener(this); getContentPane().add(btnTest1, BorderLayout.NORTH); getContentPane().add(btnTest2, BorderLayout.SOUTH); } protected void handleEnterKey() { if (getRootPane().getDefaultButton() == null) { Component comp = getFocusOwner(); if (comp instanceof JButton) ((JButton)comp).doClick(); } } public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(this, e.getActionCommand(), "Button Pressed", JOptionPane.INFORMATION_MESSAGE); } /** * Runs application * @param args the command line arguments */ public static void main(String[] args) { SwingUtilities.invokeLater( new Runnable() { public void run() { TestApp test = new TestApp(); test.pack(); test.setVisible(true); } }); } private class EnterDialogAction extends AbstractAction { public void actionPerformed(ActionEvent e) { TestApp.this.handleEnterKey(); } } }
JOptionPane jop = new JOptionPane("Really want to delete it?)",JOptionPane.QUESTION_MESSAGE,JOptionPane.YES_NO_OPTION);
JDialog dialog = jop.createDialog(this, "Confirm.");
dialog.show();
//constant for left button x = 122
Point p = dialog.getFocusOwner().getLocation();
if (p.x == 122)
//deleteWhatYouWant
setDefaultButton()
. Vy ale zřejmě chcete, aby na Enter reagovalo právě vybrané tlačítko, s tím, abyste nemusel uživatelům vyvsětlovat, že někdy se tlačítko aktivuje mezerníkem a někdy enterem. V tom případě můžete být klidný, tlačítko se vždy aktivuje mezerníkem, enter slouží vždy k aktivaci implicitního tlačítka. Budete-li se pokoušet toto chování předefinovat, uděláte v tom uživatelům akorát zmatek.
Nevím, čemu říkáte MessageDialog, ale JOptionPane má stejné chování – tlačítko se aktivuje mezerníkem. Nevím, jestli na chování tlačítek něco nemůže změnit L&F.
//set new JOptionPane
JOptionPane jop = new JOptionPane("Opravdu chcete smazat záznam?",JOptionPane.QUESTION_MESSAGE,JOptionPane.YES_NO_OPTION);
//set new JDialog, use already defined JOptionPane
JDialog dialog = jop.createDialog(this, "Potvrďte smazání záznamu.");
dialog.show();
/*if Focused component's hashcode is the same as the hashcode of first button of JOptionPane (getAccessibleChild(0)), delete record*/
if(dialog.getFocusOwner().hashCode() == jop.getComponent
(1).getAccessibleContext().getAccessibleChild(0).hashCode())
//delete it
Tiskni
Sdílej: